添加存储在数据框中的列表
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 数组。
我有两个数据框:
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 数组。