Python 对存储在dataframe中的多个列表求和
我有一个包含多个列表的数据框,存储为: 我有两个数据帧:Python 对存储在dataframe中的多个列表求和,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个包含多个列表的数据框,存储为: 我有两个数据帧: df1.ix[1:3] DateTime Col1 Col2 2018-01-02 [1, 2] [11, 21] 2018-01-03 [3, 4] [31, 41] 我想对df1中的列表求和,得到: DateTime sumCol 2018-01-02 [12, 23] 2018-01-03 [34, 45] 我尝试了numpy.sum(df1,axis=1),但这会
df1.ix[1:3]
DateTime Col1 Col2
2018-01-02 [1, 2] [11, 21]
2018-01-03 [3, 4] [31, 41]
我想对df1中的列表求和,得到:
DateTime sumCol
2018-01-02 [12, 23]
2018-01-03 [34, 45]
我尝试了numpy.sum(df1,axis=1)
,但这会导致列表连接而不是sum
编辑:
我的原始数据帧有两列以上 使用列表理解和
np.array
:
df.assign(sumCol=[np.array(x) + np.array(y) for x, y in zip(df.Col1, df.Col2)])
如果阵列的长度始终相同:
df.assign(sumCol=[np.stack([x,y]).sum(0) for x, y in zip(df.Col1, df.Col2)])
要将此应用于许多列,可以使用iloc
zip(*df.iloc[:, 1:].values.T)
下面是一个更宽数据帧的示例:
A B C D
0 1 [1, 2] [1, 2] [1, 2]
1 2 [3, 4] [3, 4] [3, 4]
2 3 [5, 6] [5, 6] [5, 6]
使用zip
和df.values
df.assign(sumCol=[np.stack(a).sum(0) for a in zip(*df.iloc[:, 1:].values.T)])
不要这样做。使用Pandas数据帧是一种效率极低的方法,因为您的一系列列表是数据类型
object
,无法通过NumPy直接访问
但是,如果你坚持的话,至少部分地将你的计算矢量化。例如,使用NumPy:
arr1 = np.array(df['Col1'].values.tolist())
arr2 = np.array(df['Col2'].values.tolist())
df['Sum'] = pd.DataFrame(arr1 + arr2).values.tolist()
print(df)
DateTime Col1 Col2 Sum
0 2018-01-02 [1, 2] [11, 21] [12, 23]
1 2018-01-03 [3, 4] [31, 41] [34, 45]
旁注,
ix
自Pandas v0.20.0以来一直被弃用。改用loc
。如何修改“np.array(x)+np.array(y)”。@Zanam添加了一个示例
A B C D sumCol
0 1 [1, 2] [1, 2] [1, 2] [3, 6]
1 2 [3, 4] [3, 4] [3, 4] [9, 12]
2 3 [5, 6] [5, 6] [5, 6] [15, 18]
arr1 = np.array(df['Col1'].values.tolist())
arr2 = np.array(df['Col2'].values.tolist())
df['Sum'] = pd.DataFrame(arr1 + arr2).values.tolist()
print(df)
DateTime Col1 Col2 Sum
0 2018-01-02 [1, 2] [11, 21] [12, 23]
1 2018-01-03 [3, 4] [31, 41] [34, 45]