汇总存储在数据框中的多个列表

时间:2018-08-30 18:39:43

标签: 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),但这导致列表串联而不是求和。

编辑: 我的原始数据框有两列以上。

2 个答案:

答案 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]

zipdf.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