合并 Pandas 列中的列表,其中列名在列表中

Posted

技术标签:

【中文标题】合并 Pandas 列中的列表,其中列名在列表中【英文标题】:Combine lists in Pandas column where column name is in list 【发布时间】:2018-06-30 04:03:15 【问题描述】:

我有三个Pandas 列,其中元素是list。为了组合这些列表,我可以通过将列的名称和+ 明确写在一起来完成

df = pd.DataFrame('allmz':([[1,2,3],[2,4,5],[2,5,5],[2,3,5],[1,4,5]]),'allint':([[11,31,31],[21,41,51],[41,51,51],[11,31,51],[1,51,11]]), 'allx':([[6,7,3],[2,4,5],[2,5,5],[2,9,5],[3,4,5]]))
df['new'] = df['allmz'] + df['allint'] + df['allint']
print df

      allint      allmz       allx                                new
0  [11, 31, 31]  [1, 2, 3]  [6, 7, 3]  [1, 2, 3, 11, 31, 31, 11, 31, 31]
1  [21, 41, 51]  [2, 4, 5]  [2, 4, 5]  [2, 4, 5, 21, 41, 51, 21, 41, 51]
2  [41, 51, 51]  [2, 5, 5]  [2, 5, 5]  [2, 5, 5, 41, 51, 51, 41, 51, 51]
3  [11, 31, 51]  [2, 3, 5]  [2, 9, 5]  [2, 3, 5, 11, 31, 51, 11, 31, 51]
4   [1, 51, 11]  [1, 4, 5]  [3, 4, 5]    [1, 4, 5, 1, 51, 11, 1, 51, 11]

但是,如果我有太多列名来编写每个列名,有没有办法通过循环(或不循环)列名列表来做到这一点: 改为columns = ['allmz','allint','allx']

【问题讨论】:

【参考方案1】:

选项 1 在列上切片并沿第一轴调用sum

df['new'] = df[['allmz','allint','allx']].sum(axis=1)

df
         allint      allmz       allx                             new
0  [11, 31, 31]  [1, 2, 3]  [6, 7, 3]  [1, 2, 3, 11, 31, 31, 6, 7, 3]
1  [21, 41, 51]  [2, 4, 5]  [2, 4, 5]  [2, 4, 5, 21, 41, 51, 2, 4, 5]
2  [41, 51, 51]  [2, 5, 5]  [2, 5, 5]  [2, 5, 5, 41, 51, 51, 2, 5, 5]
3  [11, 31, 51]  [2, 3, 5]  [2, 9, 5]  [2, 3, 5, 11, 31, 51, 2, 9, 5]
4   [1, 51, 11]  [1, 4, 5]  [3, 4, 5]   [1, 4, 5, 1, 51, 11, 3, 4, 5]

选项 2np.concatenate 的另一个选项:

v = df[['allmz','allint','allx']].values.tolist()
df['new'] = np.concatenate(v, axis=0).reshape(len(df), -1).tolist()

df

         allint      allmz       allx                             new
0  [11, 31, 31]  [1, 2, 3]  [6, 7, 3]  [1, 2, 3, 11, 31, 31, 6, 7, 3]
1  [21, 41, 51]  [2, 4, 5]  [2, 4, 5]  [2, 4, 5, 21, 41, 51, 2, 4, 5]
2  [41, 51, 51]  [2, 5, 5]  [2, 5, 5]  [2, 5, 5, 41, 51, 51, 2, 5, 5]
3  [11, 31, 51]  [2, 3, 5]  [2, 9, 5]  [2, 3, 5, 11, 31, 51, 2, 9, 5]
4   [1, 51, 11]  [1, 4, 5]  [3, 4, 5]   [1, 4, 5, 1, 51, 11, 3, 4, 5]

【讨论】:

比我的好。 @Alex 谢谢你,但你不必删除 :-) 是的@Alex我只是想说我从你的代码中得到错误`TypeError:只能连接列表(而不是“unicode”)。它让我发现了我的玩具和真实数据之间的区别 未删除... @Jan 这些列表真的是字符串吗?对我来说很好。 @Jan 抱歉,但这超出了您原始问题的范围,此答案适用于提供的数据。现在,将字符串转换为列表是另一回事,我会给你这个链接:***.com/questions/48008191/…【参考方案2】:

您可以使用 Python 的内置 sum 函数。

df['new'] = sum([df[col] for col in df], [])

【讨论】:

【参考方案3】:

如果您有大量列名,那么解决此问题的简单方法如下所示:

col = df.loc[: , "allint":"allx"]

其中“allint”是开始列名,“allx”是结束列名

df['new'] = col.sum(axis=1)
df

这将为您提供与写入每列名称后相同的结果。

【讨论】:

以上是关于合并 Pandas 列中的列表,其中列名在列表中的主要内容,如果未能解决你的问题,请参考以下文章

当列中的项目是列表时,列上的合并 Pandas DataFrame 的 TypeError

pandas df 子集按列中的字符串与列表

循环遍历 pandas 数据框列中的列表元素以在新列中返回列表

从列表中更改 Pandas Dataframe 中的列名

有啥方法可以扩展包含列表的 pandas Dataframe 中的列并从列表值本身中获取列名?

将 pandas 列中的列表转换为字符串