我有一行代码:
g = x.groupby('Color')
颜色有红色,蓝色,绿色,黄色,紫色,橙色和黑色。我该如何退回此清单?对于类似的属性,我使用x.Attribute并且它工作正常,但x.Color的行为方式不同。
答案 0 :(得分:34)
有更简单的方法:
g = x.groupby('Color')
g.groups.keys()
通过执行groupby()
pandas返回一个分组DF的字典。
您可以通过内置函数keys()
的python轻松获取此dict的键列表。
答案 1 :(得分:13)
我想将此添加为对Yanqi Ma的回答的评论,但我还没有评论的声誉。
如果您不关心群组的顺序,那么答案将正常运作:
g = x.groupby('Color')
g.groups.keys()
list(g.groups) # or this
但是,请注意g.groups
是字典,因此密钥本质上是无序的!即使您在sort=True
上使用groupby
也是如此对组进行排序的方法,默认为true。
当它在两个平台上产生不同的顺序时,这实际上让我很难,特别是因为我使用的是list(g.groups)
,所以起初并不明显g.groups
是dict
}。
在我看来,最好的方法是利用GroupBy object has an iterator这一事实,并使用列表推导按照它们在GroupBy对象中存在的顺序返回组:
g = x.groupby('Color')
groups = [name for name,unused_df in g]
它的可读性稍差,但这将始终以正确的顺序返回组。
答案 2 :(得分:3)
据我了解,您有一个包含多列的数据框。其中一个专栏是" Color"它有不同类型的颜色。您想要返回存在的唯一颜色列表。
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
。
答案 3 :(得分:2)
这是如何做到的。
groups = list()
for g, data in x.groupby('Color'):
print(g, data)
groups.append(g)
这里的核心思想是:如果你通过迭代器迭代一个数据帧组,你将得到一个两元组(组名,过滤数据帧),其中过滤后的数据帧只包含与之对应的记录基)。
答案 4 :(得分:2)
我比较了上述解决方案的运行时(与我的数据):
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()”是最好的方法。
答案 5 :(得分:0)