pandas 列表变成了pd.系列,又是一个维度的列表

nqwrtyyt  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(101)

我对Pandas还有另一个问题,我永远不会在这个图书馆里做我的Pandas。
首先,我认为zip()应该是这样处理列表的:

import numpy as np
import pandas as pd

a = [1,2]
b = [3,4]
print(type(a))
print(type(b))

vv = zip([1,2], [3,4])
for i, v in enumerate(vv):
    print(f"{i}: {v}")

输出:

<class 'list'>
<class 'list'>
0: (1, 3)
1: (2, 4)

问题。我创建了一个 Dataframe ,其中包含列表元素(在实际代码中,列表来自分组操作,我不能更改它们,基本上它们包含了 Dataframe 中按列分组的所有值)。

# create dataframe
values = [{'x': list( (1, 2, 3) ), 'y': list( (4, 5, 6))}]
df = pd.DataFrame.from_dict(values)
print(df)

           x          y
0  [1, 2, 3]  [4, 5, 6]

但是,列表现在为pd.Series

print(type(df["x"]))

<class 'pandas.core.series.Series'>

如果我这样做:

col1 = df["x"].tolist()
col2 = df["y"].tolist()

print(f"col1 is of type {type(col1)}, with length {len(col1)}, first el is {col1[0]} of type {type(col1[0])}")

col1 is of type <class 'list'>, width length 1, first el is [1, 2, 3] of type <class 'list'>

基本上,tolist()返回了list的list(为什么?):
事实上:

print("ZIP AND ITER")
vv = zip(col1, col2)
for v in zip(col1, col2):
    print(v)

ZIP AND ITER
([1, 2, 3], [4, 5, 6])

我只需要计算这个:

# this fails because x (y) is a list
# df['s'] = [np.sqrt(x**2 + y**2) for x, y in zip(df["x"], df["y"])]

我可以添加df["x"][0],这看起来不是很优雅。
问题:当xy位于两列df["x"]df["y"]中时,我应该如何计算sqrt(x^2 + y^2)

vxf3dgd4

vxf3dgd41#

这应计算df['s']

df['s'] = df.apply(lambda row: [np.sqrt(x**2 + y**2) for x, y in zip(row["x"], row["y"])], axis=1)
sg3maiej

sg3maiej2#

基本上,tolist()返回了list的list(为什么?):
因为你的 Dataframe 只有一行,两列,并且两列都包含list作为它的值,所以,返回该列作为它的值的list,它将返回一个list,其中包含1个元素(值的列表)。
我认为您希望创建如下的 Dataframe :

values = {'x': list( (1, 2, 3) ), 'y': list( (4, 5, 6))}

   x  y
0  1  4
1  2  5
2  3  6
dtcbnfnu

dtcbnfnu3#

values = [{'x': list( (1, 2, 3) ), 'y': list( (4, 5, 6))}]
df = pd.DataFrame.from_dict(values)

打印(df)#产量

x          y
 0  [1, 2, 3]  [4, 5, 6]

计算sqrt(x^2 + y^2)的一个优雅的解决方案可以通过如下转换 Dataframe 来完成:

new_df = df.iloc[0,:].apply(pd.Series).T.reset_index(drop=True)

这将生成以下输出

x   y
0   1   4
1   2   5
2   3   6

现在计算平方(x^2 + y^2)

np.sqrt(new_df['x']**2 + new_df['y']**2)

这产生:

0    4.123106
1    5.385165
2    6.708204
dtype: float64

相关问题