添加存储在数据框中的列表

Adding lists stored in dataframe

我有两个数据框:

df1.ix[1:3]
DateTime
2018-01-02    [-0.0031537018416199097, 0.006451397621428631,...
2018-01-03    [-0.0028882814454597745, -0.005829869983964528...


df2.ix[1:3]
DateTime
2018-01-02    [-0.03285881500135208, -0.027806145786217932, ...
2018-01-03    [-0.0001314381449719178, -0.006278235444742629...

len(df1.ix['2018-01-02'][0])
500

len(df2.ix['2018-01-02'][0])
500

当我这样做时 df1 + df2 我得到:

len((df1 + df2).ix['2018-01-02'][0])
1000

所以,列表而不是求和被连接起来。

如何在数据框中添加元素明智的列表 df1 and df2

将它们转换为系列,使它们成为列,然后添加您的 dfs:

df1 = df1.apply(pd.Series, axis=1)
df2 = df2.apply(pd.Series, axis=1)

df1 + df2

当在两个数据帧之间应用操作时,它会在元素级别广播。您的情况下的元素是一个列表,当在两个列表之间应用“+”运算符时,它会将它们连接起来。这就是生成的数据框包含连接列表的原因。

可以有多种方法来实际汇总列表的元素而不是串联。

一种方法是将列表元素转换为列,然后添加数据框,然后将列合并回单个列表。(第一个答案中建议但方式错误)

第 1 步:将列表元素转换为列

df1=df1.apply(lambda row:pd.Series(row[0]), axis=1)
df2=df2.apply(lambda row:pd.Series(row[0]), axis=1)

我们需要传递 row[0] 而不是 row 来去除与系列关联的列索引。

第 2 步:添加数据帧

df=df1+df2 #this dataframe will have 500 columns

第 3 步:将列合并回列表

df=df.apply(lambda row:pd.Series({0:list(row)}),axis=1)

这是一个有趣的部分。我们为什么 return 在这里制作一个系列?为什么只有 returning list(row) 不起作用并保留 500 列?

原因是 - 如果列表的长度 returned 与开始时列的长度相同,那么这个列表就适合列,对我们来说似乎什么都没有发生。而如果列表的长度不等于列数,则将其 return 编辑为单个列表。

我们来看一个例子。

假设我有一个数据框,包含列 0、1 和 2。

df=pd.DataFrame({0:[1,2,3],1:[4,5,6],2:[7,8,9]})

0 1 2
0 1 4 7
1 2 5 8
2 3 6 9

原始数据框中的列数是 3。如果我尝试 return 一个包含两列的列表,它会工作并且一个系列是 returned,

df1=df.apply(lambda row:[row[0],row[1]],axis=1)

0 [1, 4]
1 [2, 5]
2 [3, 6]
dtype: 对象

相反,如果尝试 return 三个数字的列表,它将适合列。

df1=df.apply(list,axis=1)

0 1 2
0 1 4 7
1 2 5 8
2 3 6 9

因此,如果我们想要 return 与列数相同大小的列表,我们必须 return 以 Series 的形式,其中一行的值已作为列表给出。

另一种方法是,将数据框的一列引入另一列,然后使用应用函数添加列。

df1[1]=df2[0]
df=df1.apply(lambda r: list(np.array(r[0])+np.array(r[1])),axis=1)

我们可以在这里利用 numpy 数组。 numpy 数组上的“+”运算符对相应的值求和并给出单个 numpy 数组。