为 pandas.DataFrame 复制 GROUP_CONCAT

Posted

技术标签:

【中文标题】为 pandas.DataFrame 复制 GROUP_CONCAT【英文标题】:Replicating GROUP_CONCAT for pandas.DataFrame 【发布时间】:2013-08-10 21:55:42 【问题描述】:

我有一个 pandas DataFrame df:

+------+---------+  
| team | user    |  
+------+---------+  
| A    | elmer   |  
| A    | daffy   |  
| A    | bugs    |  
| B    | dawg    |  
| A    | foghorn |  
| B    | speedy  |  
| A    | goofy   |  
| A    | marvin  |  
| B    | pepe    |  
| C    | petunia |  
| C    | porky   |  
+------+---------  

我想找到或编写一个函数来返回一个 DataFrame,我将使用以下方法在 mysql 中返回:

SELECT
  team,
  GROUP_CONCAT(user)
FROM
  df
GROUP BY
  team

对于以下结果:

+------+---------------------------------------+  
| team | group_concat(user)                    |  
+------+---------------------------------------+  
| A    | elmer,daffy,bugs,foghorn,goofy,marvin |  
| B    | dawg,speedy,pepe                      |  
| C    | petunia,porky                         |  
+------+---------------------------------------+  

我可以通过遍历行并添加到字典来想出一些讨厌的方法,但必须有更好的方法。

【问题讨论】:

【参考方案1】:

执行以下操作:

df.groupby('team').apply(lambda x: ','.join(x.user))

获取Series 的字符串或

df.groupby('team').apply(lambda x: list(x.user))

获得Serieslists 个字符串。

结果如下:

In [33]: df.groupby('team').apply(lambda x: ', '.join(x.user))
Out[33]:
team
a       elmer, daffy, bugs, foghorn, goofy, marvin
b                               dawg, speedy, pepe
c                                   petunia, porky
dtype: object

In [34]: df.groupby('team').apply(lambda x: list(x.user))
Out[34]:
team
a       [elmer, daffy, bugs, foghorn, goofy, marvin]
b                               [dawg, speedy, pepe]
c                                   [petunia, porky]
dtype: object

请注意,通常对这些类型的Series 进行任何进一步的操作都会很慢并且通常不鼓励。如果有另一种聚合方式而不将 list 放在 Series 内,则应考虑改用该方法。

【讨论】:

如果我需要将这种类型的东西重新加载到数据框中(并且,理想情况下,能够指定分组列的列名)我会怎么做? 你可以试试df.groupby('team').apply(lambda x: list(x.user)).to_pickle('pickle.pkl') 可以添加新列吗?【参考方案2】:

如果你想使用agg,一个更通用的解决方案:

df.groupby('team').agg('user' : lambda x: ', '.join(x))

【讨论】:

以上是关于为 pandas.DataFrame 复制 GROUP_CONCAT的主要内容,如果未能解决你的问题,请参考以下文章

带有 Pandas DataFrame 的“df.isnull().any().any()”的更惯用版本? [复制]

如何将 GitHub 制作成 pandas DataFrame? [复制]

如何通过析取语句(逻辑“或”)对 pandas DataFrame 进行切片? [复制]

将嵌套对象的JSON转换为Pandas Dataframe

在 Pandas DataFrame 中复制其他单元格的值 [重复]

如何更改 pandas DataFrame 的最后 7 列的列名? [复制]