如何打印分组对象


133

我想打印与熊猫分组的结果。

我有一个数据框:

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。
user3465658 2014年

1
如何直接“列出()”对象?然后,您可以将其作为常规数据结构进行处理/打印。
Tropicpenguin

据我所知,没有一个答案能产生期望的输出。对于此特定示例,我能找到的最接近的是df.groupby(['A', 'B']).sum(),但是如果('A', 'B')对不是唯一的,它将失败。
埃里克·杜米尼尔

Answers:


100

只需做:

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_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")

1
另一个选择是:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen

__iter __()也可以工作,它返回每个组的(名称,子集对象的)生成器生成顺序
Jeremy

为什么不循环key_list_from_gb呢?
pfnuesel

66

如果您只是在寻找一种显示方式,可以使用describe():

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

这给您一个整洁的桌子。


6
这是一张整洁的桌子,但不是想要的桌子。
Eric Duminil '19

15

我确认了head()版本0.12和0.13之间的更改行为。在我看来,这似乎是个虫子。我创建了一个问题

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

如果您要做的只是按A列中的值排序,则应使用df.sort('A')


4
请注意,head实际上head(5)这是在显示前5行,与“ show”帧更正确的是df.groupby('A').apply(lambda x: x),实际上是passthru。我想您可能有一种pass()方法。
杰夫2014年


9

另外,其他简单的选择可能是:

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

6

除了以前的答案:

以你为例

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

然后是简单的1行代码

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

4

感谢Surya的深刻见解。我会清理他的解决方案,然后简单地执行以下操作:

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

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)

尝试将其作为分组结果后,您将获得输出

希望对您有所帮助


2

在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'),则可以调用列表(df_g),或者如果您只希望第一个组调用列表(df_g)[0]。这是我喜欢R over Python的一件事。在R中,您不必遍历大多数对象即可查看数据,但是Python则需要处理许多对象。查找这样的过程令人耳目一新。谢谢伊丽莎白。
PVic

2

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


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


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

以更互动的方式


-2

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

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

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.