Python Pandas GroupBy获取组列表

use*_*115 19 python pandas

我有一行代码:

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().

  • 这比其他答案更“受欢迎”。:) (4认同)
  • `groupby()` 不返回 `dict`,而是返回一个 `DataFrameGroupBy` 对象。 (4认同)
  • 在Python3.x中,上面的代码将抛出 TypeError 并且首选`list(g.groups)`,另请参阅[此问题中接受的答案](/sf/ask/1298640101/ -keys-element-by-index-in-python3) (2认同)

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=Truegroupby方法对组进行排序也是如此,默认情况下为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)

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


eri*_*mjl 7

以下是具体操作方法。

groups = list()
for g, data in x.groupby('Color'):
    print(g, data)
    groups.append(g)
Run Code Online (Sandbox Code Playgroud)

这里的核心思想是这样的:如果您通过迭代器迭代数据帧 groupby ,您将返回一个二元组(组名称,过滤数据帧),其中过滤数据帧仅包含与该组对应的记录)。

  • 或者,如果您想获取每列中存在的唯一值,您可以执行“numpy.unique(x[col_name].values)” (2认同)

Zyt*_*hyr 6

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

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.


Ita*_*oth 5

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

\n\n
In [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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

看来“d.groups.keys()”是最好的方法。

\n