【问题标题】:Adding lists stored in dataframe添加存储在数据框中的列表
【发布时间】:2019-02-03 13:28:54
【问题描述】:

我有两个数据框:

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

【问题讨论】:

  • 您的数据框只有一列?

标签: pandas dataframe python-3.5


【解决方案1】:

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

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

df1 + df2

【讨论】:

  • 如何将 (df1 + df2) 转换回列表?
  • (df1 + df2).apply(list, axis=1)
  • 这个列表函数仍然保留500列
  • axis=1?我已经在我的机器上测试并处理了一些示例数据
  • 具有列索引的系列将被传递给应用方法。再次对其应用系列方法将返回相同的内容。所以上面的方法是行不通的。
【解决方案2】:

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

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

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

第 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)

这是一个有趣的部分。为什么我们要在这里返回一个系列?为什么只返回 list(row) 不起作用并继续保留 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]
数据类型:对象

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多