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

时间:2018-08-28 20:40:39

标签: pandas dataframe python-3.5

我有两个数据框:

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中添加列表。

2 个答案:

答案 0 :(得分:1)

将它们投射为系列,以便它们成为列,然后添加dfs:

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

df1 + df2

答案 1 :(得分:1)

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

可以使用多种方法对列表元素进行实际汇总,而不是进行串联。

一种方法可以是将列表元素转换为列,然后添加数据框,然后将列合并回到单个列表中。(这是第一个答案中提出的,但方法错误)

步骤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)

这是一个有趣的部分。我们为什么要在这里返回系列?为什么仅返回列表(行)无效,并保留500列?

原因是-如果返回的列表长度与开头的列长度相同,则此列表适合列,对我们而言似乎没有任何反应。而如果列表的长度不等于列数,那么它将作为单个列表返回。

我们来看一个例子。

假设我有一个数据框,具有列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。如果我尝试返回包含两列的列表,则它可以正常工作并返回一系列,

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

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

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

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

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

因此,如果要返回与列数相同大小的列表,则必须以Series的形式返回它,其中一行的值已作为list给出。

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

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

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