我有一行代码:
g = x.groupby('Color')
Run Code Online (Sandbox Code Playgroud)
颜色有红色,蓝色,绿色,黄色,紫色,橙色和黑色.我该如何退回此清单?对于类似的属性,我使用x.Attribute并且它工作正常,但x.Color的行为方式不同.
小智 43
有更简单的方法:
g = x.groupby('Color')
g.groups.keys()
Run Code Online (Sandbox Code Playgroud)
通过做groupby()pandas返回一个分组DF的字典.您可以通过python内置函数轻松获取此dict的键列表keys().
Eri*_*wan 17
我想补充一下这是对Yanqi Ma的答案的评论,但我还没有评论的声誉.
如果您不关心组的顺序,那么答案将正常工作:
g = x.groupby('Color')
g.groups.keys()
list(g.groups) # or this
Run Code Online (Sandbox Code Playgroud)
但是,请注意这g.groups是一本字典,所以键本身就是无序的!即使您使用sort=True该groupby方法对组进行排序也是如此,默认情况下为true.
这实际上咬了我一下,当它导致了不同的顺序在两个平台上,尤其是因为我用list(g.groups),所以并不明显起初认为g.groups是一个dict.
在我看来,最好的方法是利用GroupBy对象具有迭代器的事实,并使用列表推导按照它们在GroupBy对象中存在的顺序返回组:
g = x.groupby('Color')
groups = [name for name,unused_df in g]
Run Code Online (Sandbox Code Playgroud)
它的可读性稍差,但这将始终以正确的顺序返回组.
以下是具体操作方法。
groups = list()
for g, data in x.groupby('Color'):
print(g, data)
groups.append(g)
Run Code Online (Sandbox Code Playgroud)
这里的核心思想是这样的:如果您通过迭代器迭代数据帧 groupby ,您将返回一个二元组(组名称,过滤数据帧),其中过滤数据帧仅包含与该组对应的记录)。
据我了解,您有一个包含多个列的数据框。其中一列是“颜色”,它具有不同类型的颜色。您想要返回存在的唯一颜色列表。
colorGroups = df.groupby(['Color'])
for c in colorGroups.groups:
print c
Run Code Online (Sandbox Code Playgroud)
上面的代码将为您提供所有存在的颜色,而无需重复颜色名称。因此,您应该得到如下输出:
Red
Blue
Green
Yellow
Purple
Orange
Black
Run Code Online (Sandbox Code Playgroud)
另一种方法是unique()函数,它返回一个系列中所有唯一值的数组。因此,要获得所有唯一颜色的数组,您可以执行以下操作:
df['Color'].unique()
Run Code Online (Sandbox Code Playgroud)
输出是一个数组,因此例如print df['Color'].unique()[3]会给你Yellow.
我比较了上述解决方案的运行时间(与我的数据):
\n\nIn [443]: d = df3.groupby("IND")\n\nIn [444]: %timeit groups = [name for name,unused_df in d]\n377 ms \xc2\xb1 27.3 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\nIn [445]: % timeit list(d.groups)\n1.08 \xc2\xb5s \xc2\xb1 47.3 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\n\nIn [446]: % timeit d.groups.keys()\n708 ns \xc2\xb1 7.18 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\n\nIn [447]: % timeit df3[\'IND\'].unique()\n5.33 ms \xc2\xb1 128 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\nRun Code Online (Sandbox Code Playgroud)\n\n看来“d.groups.keys()”是最好的方法。
\n| 归档时间: |
|
| 查看次数: |
56135 次 |
| 最近记录: |