如何打印 groupby 对象
Posted
技术标签:
【中文标题】如何打印 groupby 对象【英文标题】:How to print a groupby object 【发布时间】:2014-05-06 15:02:39 【问题描述】:我想打印与 Pandas 分组的结果。
我有一个数据框:
import pandas as pd
df = pd.DataFrame('A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6))
print(df)
A B
0 one 0
1 one 1
2 two 2
3 three 3
4 three 4
5 one 5
在按“A”分组后打印时,我有以下内容:
print(df.groupby('A'))
<pandas.core.groupby.DataFrameGroupBy object at 0x05416E90>
如何打印分组的数据框?
如果我这样做:
print(df.groupby('A').head())
我获得的数据框好像没有分组一样:
A B
A
one 0 one 0
1 one 1
two 2 two 2
three 3 three 3
4 three 4
one 5 one 5
我期待的是这样的:
A B
A
one 0 one 0
1 one 1
5 one 5
two 2 two 2
three 3 three 3
4 three 4
【问题讨论】:
我用print df.groupby('A').head()
得到了正确的输出。你有什么版本的熊猫?
我刚刚在台式机和笔记本电脑上更新到 0.13.1。
如何直接“列出()”对象?然后您可以将其作为普通数据结构进行操作/打印。
据我所知,没有一个答案能够产生所需的输出。对于这个特定示例,我能找到的最接近的是 df.groupby(['A', 'B']).sum()
,但如果 ('A', 'B')
对不是唯一的,它将失败。
你好。我可以知道如何仅在输出中打印 "one" 、 "two" 、 "three" 吗?我的意思是只打印我们分组的数据。我想用这些数据来标记我的饼图。
【参考方案1】:
我确认head()
的行为在版本 0.12 和 0.13 之间发生了变化。这对我来说就像一个错误。我创建了一个issue。
但是 groupby 操作实际上并不返回按组排序的 DataFrame。 .head()
方法在这里有点误导——它只是一个方便的功能,让您重新检查您分组的对象(在本例中为df
)。 groupby
的结果是一种单独的对象,一个 GroupBy
对象。您必须 apply
、transform
或 filter
才能返回 DataFrame 或 Series。
如果您只想按 A 列中的值排序,则应使用 df.sort('A')
。
【讨论】:
请注意,head
实际上是在做head(5)
,因为它显示了前 5 行,更正确的“显示”框架是 df.groupby('A').apply(lambda x: x)
,这实际上是一个通路。我想你可以有一个pass()
方法,也许吧。【参考方案2】:
简单地做:
grouped_df = df.groupby('A')
for key, item in grouped_df:
print(grouped_df.get_group(key), "\n\n")
弃用通知:
ix
原为 deprecated in 0.20.0
这也有效,
grouped_df = df.groupby('A')
gb = grouped_df.groups
for key, values in gb.iteritems():
print(df.ix[values], "\n\n")
对于选择性键分组:在key_list_from_gb
中插入您想要的键,如下所示,使用gb.keys()
:例如,
gb = grouped_df.groups
gb.keys()
key_list_from_gb = [key1, key2, key3]
for key, values in gb.items():
if key in key_list_from_gb:
print(df.ix[values], "\n")
【讨论】:
另一个选项是:for A in d['A'].unique(): print(A, df.query(f'A == "A"'))
__iter__()也可以。它返回生成器为每个组生成(名称,子集对象)序列
为什么不遍历key_list_from_gb
呢?【参考方案3】:
另外,其他简单的选择可能是:
gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)
【讨论】:
【参考方案4】:如果您只是在寻找一种显示方式,您可以使用 describe():
grp = df.groupby['colName']
grp.describe()
这会给你一张整洁的桌子。
【讨论】:
这是一张整洁的桌子,但它不是理想的桌子。【参考方案5】:另一个简单的选择:
for name_of_the_group, group in grouped_dataframe:
print (name_of_the_group)
print (group)
【讨论】:
【参考方案6】:感谢 Surya 的精彩见解。我会清理他的解决方案并简单地做:
for key, value in df.groupby('A'):
print(key, value)
【讨论】:
【参考方案7】:我发现了一个棘手的方法,仅供头脑风暴,见代码:
df['a'] = df['A'] # create a shadow column for MultiIndexing
df.sort_values('A', inplace=True)
df.set_index(["A","a"], inplace=True)
print(df)
输出:
B
A a
one one 0
one 1
one 5
three three 3
three 4
two two 2
优点很容易打印,因为它返回一个数据框,而不是 Groupby 对象。输出看起来不错。 而缺点是它会创建一系列冗余数据。
【讨论】:
【参考方案8】:您无法通过 print 语句直接查看 groupBy 数据,但您可以通过使用 for 循环遍历组来查看 试试这个代码按数据查看分组
group = df.groupby('A') #group variable contains groupby data
for A,A_df in group: # A is your column and A_df is group of one kind at a time
print(A)
print(A_df)
尝试将其作为分组结果后,您将获得输出
希望对你有帮助
【讨论】:
【参考方案9】:在 GroupBy 对象上调用 list()
print(list(df.groupby('A')))
给你:
[('one', A B
0 one 0
1 one 1
5 one 5), ('three', A B
3 three 3
4 three 4), ('two', A B
2 two 2)]
【讨论】:
是的,这需要更多的选票!您也可以在对对象进行分组后执行此操作。 df_g = df.groupby('A') 那么你可以调用 list(df_g) 或者如果你只想要第一个组调用 list(df_g)[0]。这是我喜欢 R over Python 的一件事。在 R 中,您不必遍历大多数对象来查看数据,但在 Python 中,您必须对很多对象进行迭代。像这样的寻找过程令人耳目一新。谢谢伊丽莎白。【参考方案10】:在python 3中
k = None
for name_of_the_group, group in dict(df_group):
if(k != name_of_the_group):
print ('\n', name_of_the_group)
print('..........','\n')
print (group)
k = name_of_the_group
以更具交互性的方式
【讨论】:
【参考方案11】:除了之前的答案:
以你为例,
df = pd.DataFrame('A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6))
然后简单的1行代码
df.groupby('A').apply(print)
【讨论】:
聪明,虽然 .apply(display) 有一个很好的格式会更好。 只需从Ipython.display
导入 display
即可:)【参考方案12】:
打印分组df的所有(或任意多)行:
import pandas as pd
pd.set_option('display.max_rows', 500)
grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
【讨论】:
【参考方案13】:在 Jupyter Notebook 中,如果您执行以下操作,它会打印一个很好的对象分组版本。 apply
方法有助于创建多索引数据框。
by = 'A' # groupby 'by' argument
df.groupby(by).apply(lambda a: a[:])
输出:
A B
A
one 0 one 0
1 one 1
5 one 5
three 3 three 3
4 three 4
two 2 two 2
如果您希望 by
列不出现在输出中,只需删除列,就像这样。
df.groupby(by).apply(lambda a: a.drop(by, axis=1)[:])
输出:
B
A
one 0 0
1 1
5 5
three 3 3
4 4
two 2 2
在这里,我不确定为什么 .iloc[:]
不起作用,而不是最后的 [:]
。因此,如果将来由于更新(或目前)出现一些问题,.iloc[:len(a)]
也可以。
【讨论】:
我有一个 df 我需要将索引设置为组,所以为了让它工作我必须使用.apply(lambda a: a.reset_index())
【参考方案14】:
df.groupby('key you want to group by').apply(print)
正如其他成员所提到的,这是可视化 groupby 对象的最简单和最简单的解决方案。
【讨论】:
欢迎 Karthik,这个答案和QPeiran's 一样吗? 是的,和QPeiran的答案一样,如果需要请删除。谢谢! 我不能删除别人的帖子,但是请自己删除,我相信你会有其他机会发布答案...不要气馁,每天都有很多新问题【参考方案15】:这是一个更好的通用答案。此函数将打印所有组名和值,或者选择显示一个或多个组。
def print_pd_groupby(X, grp=None):
'''Display contents of a Panda groupby object
:param X: Pandas groupby object
:param grp: a list with one or more group names
'''
if grp is None:
for k,i in X:
print("group:", k)
print(i)
else:
for j in grp:
print("group:", j)
print(X.get_group(j))
在您的示例中,这里是会话输出
In [116]: df = pd.DataFrame('A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6))
In [117]: dfg = df.groupby('A')
In [118]: print_pd_groupby(dfg)
group: one
A B
0 one 0
1 one 1
5 one 5
group: three
A B
3 three 3
4 three 4
group: two
A B
2 two 2
In [119]: print_pd_groupby(dfg, grp = ["one", "two"])
group: one
A B
0 one 0
1 one 1
5 one 5
group: two
A B
2 two 2
这是一个更好的答案,因为函数是可重复使用的内容,请将其放入您的包或函数集合中,并且永远不要重新编写那种“脚本化”方法。
恕我直言,这样的东西应该是 Pandas groupby 中的内置方法。
【讨论】:
【参考方案16】:df.groupby('A').apply(display)
提供简洁的格式
【讨论】:
显示什么? 被低估了。 @misantroop 这是 Jupyter 的显示功能 问题与 Jupyter 无关,也没有标记。【参考方案17】:您只需要将 DataFrameGroupBy 对象转换为列表,您就可以简单地打印它.. ls_grouped_df = list(df.groupby('A')) 打印(ls_grouped_df)
【讨论】:
【参考方案18】:使用 get_group() 方法 你可以有这样的东西
new_group = df.groupby(['A'])
get_group('')
把你想进入的组的名字放在方法里面
【讨论】:
以上是关于如何打印 groupby 对象的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 groupBy() 对 Collection 对象进行分组