如何打印groupby对象

时间:2014-03-27 14:42:29

标签: python pandas

我想用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

17 个答案:

答案 0 :(得分:61)

简单地说:

grouped_df = df.groupby('A')

for key, item in grouped_df:
    print(grouped_df.get_group(key), "\n\n")

这也有效,

grouped_df = df.groupby('A')    
gb = grouped_df.groups

for key, values in gb.iteritems():
    print(df.ix[values], "\n\n")

对于选择性密钥分组:使用key_list_from_gbgb.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")

答案 1 :(得分:40)

如果您只是想找到一种显示方法,可以使用describe():

grp = df.groupby['colName']
grp.describe()

这给你一个整洁的表。

答案 2 :(得分:15)

除了以前的答案:

以您的示例为例,

df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})

然后是简单的1行代码

df.groupby('A').apply(print)

答案 3 :(得分:10)

我确认head()的行为在版本0.12和0.13之间发生了变化。对我来说这看起来像个错误。我创建了一个issue

但是groupby操作实际上并不返回按组排序的DataFrame。 .head()方法在这里有点误导 - 这只是一个方便的功能,让您重新检查您分组的对象(在本例中为df)。 groupby的结果是单独的对象,GroupBy对象。您必须applytransformfilter才能返回DataFrame或系列。

如果您只想按照A列中的值进行排序,则应使用df.sort('A')

答案 4 :(得分:7)

此外,其他简单的替代方案可能是:

gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)

答案 5 :(得分:5)

在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)]也可以使用。

答案 6 :(得分:4)

在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)]

答案 7 :(得分:3)

另一个简单的选择:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)

答案 8 :(得分:2)

您不能直接通过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 :(得分:2)

df.groupby(“您要分组的键”)。apply(打印)

正如另一位成员所提到的,这是可视化groupby对象的最简便方法。

答案 10 :(得分:1)

这是一个更好的通用答案。此函数将打印所有组名和值,或者可选择一个或多个组进行显示。

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 中的内置方法。

答案 11 :(得分:1)

df.groupby('A').apply(display)

提供整洁的格式

答案 12 :(得分:0)

我发现了一个棘手的方法,只是为了头脑风暴,请参见代码:

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 Object。输出看起来不错。 缺点是会创建一系列冗余数据。

答案 13 :(得分:0)

在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

以更具交互性的方式

答案 14 :(得分:0)

感谢Surya的深入见解。我会清理他的解决方案,然后简单地做:

for key, value in df.groupby('A'):
    print(key, value)

答案 15 :(得分:0)

您只需要将 DataFrameGroupBy 对象转换为列表,您就可以简单地打印它.. ls_grouped_df = list(df.groupby('A')) 打印(ls_grouped_df)

答案 16 :(得分:-2)

打印分组的df的所有(或任意多行):

import pandas as pd
pd.set_option('display.max_rows', 500)

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)