Python Pandas GroupBy 获取组列表

Posted

技术标签:

【中文标题】Python Pandas GroupBy 获取组列表【英文标题】:Python Pandas GroupBy get list of groups 【发布时间】:2015-05-04 20:32:16 【问题描述】:

我有一行代码:

g = x.groupby('Color')

颜色有红色、蓝色、绿色、黄色、紫色、橙色和黑色。如何返回此列表?对于类似的属性,我使用 x.Attribute 并且效果很好,但是 x.Color 的行为方式不同。

【问题讨论】:

所以你想要一个 Color 中唯一值的列表? 你可以从你的 orig df 中获取唯一值,无需分组 x['Color'].unique() x['Color'].unique 最终正是我想要的。谢谢。 【参考方案1】:

有更简单的方法:

g = x.groupby('Color')

g.groups.keys()

groupby()pandas 会返回一个分组 DF 的字典。 你可以通过python内置函数keys()轻松获取这个dict的key列表。

【讨论】:

这比其他答案更多pandorable。 :) 在决定使用哪种方法之前,请先查看下面 Erik Swan 的回答。如果组名的顺序一致是个问题,请采用 Erik 的方式。 groupby() 不返回 dict,而是返回 DataFrameGroupBy 对象。 在 Python3.x 中,上面的代码会抛出一个 TypeError,list(g.groups) 是首选,另见the accepted answer in this question @Adriaan 我在 Python 3.10.1 上运行它时没有收到任何错误,也许更新改变了它?【参考方案2】:

如果您不关心组的顺序,Yanqi Ma 的回答会很好:

g = x.groupby('Color')
g.groups.keys()
list(g.groups) # or this

但是,请注意g.groups 是一个字典,因此键本质上是无序的! 即使您在groupby 方法上使用sort=True 对组进行排序也是如此,默认情况下是这样。

当它在两个平台上导致不同的顺序时,这实际上让我很难受,尤其是因为我使用的是list(g.groups),所以一开始g.groupsdict 并不明显。

在我看来,最好的方法是利用 GroupBy object has an iterator 的事实,并使用列表推导式按照 GroupBy 对象中存在的顺序返回组:

g = x.groupby('Color')
groups = [name for name,unused_df in g]

它的可读性稍差,但这将始终以正确的顺序返回组。

【讨论】:

只是想知道我怎么知道 GroupBy 对象的属性?因为作为前提,我认为名称应该是属性之一。但是,我在 pandas 文档中找不到相关信息。 GroupBy 对象的所有方法和属性都记录在the Pandas documentation。 上述问题适用于 3.7 之前的 Python 版本。对于较新的 Python 版本,字典键 (insertion) ordered。我希望 list(g.groups)==[name for name,_ in g] 是 True,无论是 sort=True 还是 sort=False 虽然 Pandas 文档没有明确说明,但我同意这可能是真的。很高兴知道这种类型的错误在 Python 3.7+ 中更难犯。【参考方案3】:

据我了解,您有一个包含多列的数据框。其中一列是“颜色”,它具有不同类型的颜色。您想要返回存在的唯一颜色列表。

colorGroups = df.groupby(['Color'])
for c in colorGroups.groups: 
    print c

上面的代码将为您提供所有存在的颜色,而无需重复颜色名称。因此,您应该得到如下输出:

Red
Blue
Green
Yellow
Purple
Orange
Black

另一种方法是unique() 函数,它返回一个系列中所有唯一值的数组。因此,要获得所有独特颜色的数组,您可以:

df['Color'].unique()

输出是一个数组,例如print df['Color'].unique()[3] 将给你Yellow

【讨论】:

【参考方案4】:

这里是怎么做的。

groups = list()
for g, data in x.groupby('Color'):
    print(g, data)
    groups.append(g)

这里的核心思想是这样的:如果你迭代一个数据帧 groupby 迭代器,你会得到一个二元组(组名,过滤数据帧),其中过滤数据帧只包含对应于该组的记录) .

【讨论】:

或者,如果您想获取每列中存在的唯一值,您可以执行numpy.unique(x[col_name].values)【参考方案5】:

我比较了上述解决方案的运行时间(与我的数据):

In [443]: d = df3.groupby("IND")

In [444]: %timeit groups = [name for name,unused_df in d]
377 ms ± 27.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [445]: % timeit  list(d.groups)
1.08 µs ± 47.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [446]: % timeit d.groups.keys()
708 ns ± 7.18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [447]: % timeit df3['IND'].unique()
5.33 ms ± 128 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

似乎 'd.groups.keys()' 是最好的方法。

【讨论】:

如果您想写一个真正有用的答案,请发布整个使用的命令和您的结果。否则使用comment 选项。 没那么简单,运行时间取决于你的数据结构。在我的例子中——一个只有几个组但每个组有很多成员的 df——我发现了完全相反的结果:列表理解最快(22 毫秒),而df.groupby(..).groups.keys() 更慢:124 毫秒。 注意:在我的实验中,我第一次运行d.groups.keys(),速度要慢很多(同样是100-300毫秒),但第二次是4毫秒。所以你的结果可能只取决于你做计时的顺序。【参考方案6】:

希望这会有所帮助.. 快乐编码 :)

df = pd.DataFrame(data=[['red','1','1.5'],['blue','20','2.5'],['red','15','4']],columns=(['color','column1','column2']))

list_req = list(df.groupby('color').groups.keys())
print(list_req)

【讨论】:

以上是关于Python Pandas GroupBy 获取组列表的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用groupby.first函数groupby.nth函数获取每个组中的第一个值实战:groupby.first函数和groupby.nth函数对比(对待NaN的差异)

应用 groupby 后从组中获取特定元素-PANDAS [重复]

Python pandas 将 groupby 对象中的每个组打印为单行

python 可打印的pandas组(来自http://stackoverflow.com/questions/14734533/how-to-access-pandas-groupby-datafr

python pandas groupby分组后的数据怎么用

Python pandas - 在 groupby 之后过滤行