为 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))
获得Series
的list
s 个字符串。
结果如下:
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 进行切片? [复制]