【问题标题】:How to print a groupby object如何打印 groupby 对象
【发布时间】:2023-03-11 05:45:02
【问题描述】:

我想打印与 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" 吗?我的意思是只打印我们分组的数据。我想用这些数据来标记我的饼图。

标签: python pandas


【解决方案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('')
                    

                    把你想进入的组的名字放在方法里面

                    【讨论】:

                      猜你喜欢
                      • 2023-01-10
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-09-03
                      • 2019-11-15
                      • 2022-01-22
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多