我有一个数据框,其中多个列表存储为:
我有两个数据框:
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)
,但这导致列表串联而不是求和。
编辑: 我的原始数据框有两列以上。
答案 0 :(得分:2)
使用列表理解和np.array
:
df.assign(sumCol=[np.array(x) + np.array(y) for x, y in zip(df.Col1, df.Col2)])
DateTime Col1 Col2 sumCol
0 2018-01-02 [1, 2] [11, 21] [12, 23]
1 2018-01-03 [3, 4] [31, 41] [34, 45]
如果数组的长度始终相同:
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)
这是更广泛的DataFrame上的示例:
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)])
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]
答案 1 :(得分:1)
不要这样做。这是一种使用Pandas数据帧的效率极低的方法,因为您的一系列列表是dtype 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
。