如何打印groupby对象

use*_*658 101 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
Run Code Online (Sandbox Code Playgroud)

在按'A'分组后打印时,我有以下内容:

print(df.groupby('A'))

<pandas.core.groupby.DataFrameGroupBy object at 0x05416E90>
Run Code Online (Sandbox Code Playgroud)

如何打印分组的数据框?

如果我做:

print(df.groupby('A').head())
Run Code Online (Sandbox Code Playgroud)

我获取数据帧,好像它没有分组:

             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
Run Code Online (Sandbox Code Playgroud)

我期待的是:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
two   2    two  2
three 3  three  3
      4  three  4
Run Code Online (Sandbox Code Playgroud)

Sur*_*rya 78

简单地说:

grouped_df = df.groupby('A')

for key, item in grouped_df:
    print(grouped_df.get_group(key), "\n\n")
Run Code Online (Sandbox Code Playgroud)

这也有效,

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

for key, values in gb.iteritems():
    print(df.ix[values], "\n\n")
Run Code Online (Sandbox Code Playgroud)

对于选择性密钥分组: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")
Run Code Online (Sandbox Code Playgroud)


小智 47

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

grp = df.groupby['colName']
grp.describe()
Run Code Online (Sandbox Code Playgroud)

这给你一个整洁的表.

  • 这是一张整洁的桌子,但不是理想的桌子。 (33认同)
  • 如果只有一个分组列,则 `df.groupby('colName')` 有效 (2认同)

QPe*_*ran 31

除了之前的答案:

以你为例,

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

然后简单的1行代码

df.groupby('A').apply(print)
Run Code Online (Sandbox Code Playgroud)

  • 只需从“Ipython.display”导入“display”即可:) (10认同)
  • 很聪明,尽管最好使用 .apply(display) 来获得良好的格式。 (5认同)

小智 16

df.groupby('A').apply(display)
Run Code Online (Sandbox Code Playgroud)

提供整洁的格式

  • 显示什么? (3认同)
  • 被低估了。@misantroop 这是 Jupyter 的显示功能 (3认同)

Dan*_*lan 12

我确认了head()版本0.12和0.13之间的变化行为.对我来说这看起来像个错误.我创造了一个问题.

但是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()`` 方法。 (4认同)

小智 12

在 Jupyter Notebook 中,如果您执行以下操作,它会打印出一个很好的对象分组版本。该apply方法有助于创建多索引数据帧。

by = 'A'  # groupby 'by' argument
df.groupby(by).apply(lambda a: a[:])
Run Code Online (Sandbox Code Playgroud)

输出:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
three 3  three  3
      4  three  4
two   2    two  2
Run Code Online (Sandbox Code Playgroud)

如果您希望by列不出现在输出中,只需删除列,就像这样。

df.groupby(by).apply(lambda a: a.drop(by, axis=1)[:])
Run Code Online (Sandbox Code Playgroud)

输出:

         B
A         
one   0  0
      1  1
      5  5
three 3  3
      4  4
two   2  2
Run Code Online (Sandbox Code Playgroud)

在这里,我不确定为什么.iloc[:]不工作而不是[:]最后。因此,如果将来由于更新(或目前)而出现一些问题,.iloc[:len(a)]也可以使用。


Sum*_*rel 10

另一个简单的选择:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)
Run Code Online (Sandbox Code Playgroud)


Sur*_*rya 8

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

gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)
Run Code Online (Sandbox Code Playgroud)


mim*_*lea 6

感谢 Surya 提供了很好的见解。我会清理他的解决方案,然后简单地做:

for key, value in df.groupby('A'):
    print(key, value)
Run Code Online (Sandbox Code Playgroud)


Eli*_*ico 5

在 GroupBy 对象上调用 list()

print(list(df.groupby('A')))
Run Code Online (Sandbox Code Playgroud)

给你:

[('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)]
Run Code Online (Sandbox Code Playgroud)