Python Pandas GroupBy 获取组列表
Python Pandas GroupBy get list of groups
我有一行代码:
g = x.groupby('Color')
颜色有红色、蓝色、绿色、黄色、紫色、橙色和黑色。我如何return这个列表?对于类似的属性,我使用 x.Attribute 并且它工作正常,但是 x.Color 的行为方式不同。
操作方法如下。
groups = list()
for g, data in x.groupby('Color'):
print(g, data)
groups.append(g)
这里的核心思想是:如果你通过迭代器迭代一个数据框,你会得到一个二元组(组名,过滤后的数据框),其中过滤后的数据框只包含对应的记录组)。
据我了解,您有一个包含多个列的数据框。其中一列是 "Color",它有不同类型的颜色。您想要 return 存在的唯一颜色列表。
colorGroups = df.groupby(['Color'])
for c in colorGroups.groups:
print c
以上代码将为您提供所有存在的颜色,而无需重复颜色名称。因此,您应该得到如下输出:
Red
Blue
Green
Yellow
Purple
Orange
Black
另一种方法是 unique() 函数,它 return 是系列中所有唯一值的数组。因此,要获得所有独特颜色的数组,您可以这样做:
df['Color'].unique()
输出是一个数组,所以例如 print df['Color'].unique()[3]
会得到 Yellow
。
有更简单的方法:
g = x.groupby('Color')
g.groups.keys()
通过执行 groupby()
pandas returns 你可以得到分组 DF 的字典。
您可以通过 python 内置函数 keys()
.
轻松获取此字典的键列表
如果不在意分组顺序,马艳琪的回答就可以了:
g = x.groupby('Color')
g.groups.keys()
list(g.groups) # or this
但是,请注意 g.groups
是一个字典,因此 键本质上是无序的! 即使您在 sort=True
上使用也是如此groupby
分组排序方法,默认为真。
当它在两个平台上导致不同的顺序时,这实际上让我很难受,特别是因为我使用的是 list(g.groups)
,所以一开始并不明显 g.groups
是一个 dict
.
在我看来,最好的方法是利用 GroupBy object has an iterator 这一事实,并使用列表推导来 return 组中存在的顺序GroupBy 对象:
g = x.groupby('Color')
groups = [name for name,unused_df in g]
它的可读性稍差,但这将始终 return 组以正确的顺序排列。
我比较了上述解决方案的运行时间(与我的数据):
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()'是最好的方法。
希望这对您有所帮助.. 编码愉快 :)
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)
我有一行代码:
g = x.groupby('Color')
颜色有红色、蓝色、绿色、黄色、紫色、橙色和黑色。我如何return这个列表?对于类似的属性,我使用 x.Attribute 并且它工作正常,但是 x.Color 的行为方式不同。
操作方法如下。
groups = list()
for g, data in x.groupby('Color'):
print(g, data)
groups.append(g)
这里的核心思想是:如果你通过迭代器迭代一个数据框,你会得到一个二元组(组名,过滤后的数据框),其中过滤后的数据框只包含对应的记录组)。
据我了解,您有一个包含多个列的数据框。其中一列是 "Color",它有不同类型的颜色。您想要 return 存在的唯一颜色列表。
colorGroups = df.groupby(['Color'])
for c in colorGroups.groups:
print c
以上代码将为您提供所有存在的颜色,而无需重复颜色名称。因此,您应该得到如下输出:
Red
Blue
Green
Yellow
Purple
Orange
Black
另一种方法是 unique() 函数,它 return 是系列中所有唯一值的数组。因此,要获得所有独特颜色的数组,您可以这样做:
df['Color'].unique()
输出是一个数组,所以例如 print df['Color'].unique()[3]
会得到 Yellow
。
有更简单的方法:
g = x.groupby('Color')
g.groups.keys()
通过执行 groupby()
pandas returns 你可以得到分组 DF 的字典。
您可以通过 python 内置函数 keys()
.
如果不在意分组顺序,马艳琪的回答就可以了:
g = x.groupby('Color')
g.groups.keys()
list(g.groups) # or this
但是,请注意 g.groups
是一个字典,因此 键本质上是无序的! 即使您在 sort=True
上使用也是如此groupby
分组排序方法,默认为真。
当它在两个平台上导致不同的顺序时,这实际上让我很难受,特别是因为我使用的是 list(g.groups)
,所以一开始并不明显 g.groups
是一个 dict
.
在我看来,最好的方法是利用 GroupBy object has an iterator 这一事实,并使用列表推导来 return 组中存在的顺序GroupBy 对象:
g = x.groupby('Color')
groups = [name for name,unused_df in g]
它的可读性稍差,但这将始终 return 组以正确的顺序排列。
我比较了上述解决方案的运行时间(与我的数据):
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()'是最好的方法。
希望这对您有所帮助.. 编码愉快 :)
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)