如何打印 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 对象。您必须 applytransformfilter 才能返回 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 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何访问python groupby对象值

如何在熊猫的 groupby 对象中获取组数?

如何使用 groupBy() 对 Collection 对象进行分组

存储或打印没有索引的df.groupby

如何在 pandas groupby 对象上调用不同的聚合操作

如何对不同长度的 Python Pandas groupby 对象进行切片?