我有两个数据框:
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
中添加列表。
答案 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数组。