groupbyオブジェクトを印刷する方法


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()。あなたはパンダのどのバージョンを持っていますか?
Amit Verma 2014年

デスクトップとラップトップの両方で0.13.1に更新しました。
user3465658

1
オブジェクトを直接「list()」するのはどうですか?そして、それを通常のデータ構造として操作/印刷できます。
Tropicpenguin

私の知る限りでは、単一の回答で目的の出力を生成することはできません。この特定の例の場合、私が見つけることができる最も近いものはでしたがdf.groupby(['A', 'B']).sum()('A', 'B')ペアが一意でない場合は失敗します。
エリックドゥミニル

回答:


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 Z

でもループしないのはなぜkey_list_from_gbですか?
pfnuesel

66

単に表示する方法を探しているのであれば、describe()を使用できます。

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

これはあなたにきちんとしたテーブルを与えます。


6
きちんとしたテーブルですが、望ましいテーブルではありません。
Eric Duminil、

15

head()バージョン0.12と0.13の間で変更の動作を確認しました。それは私にはバグのように見えます。問題を作成しました。

しかし、groupby操作は、実際にはグループでソートされたDataFrameを返しません。ここでの.head()方法は少し誤解を招くdfものです。これは、グループ化したオブジェクト(この場合は)を再確認できる便利な機能にすぎません。の結果groupbyは、別の種類のオブジェクト、GroupByオブジェクトです。あなたはしなければならないapplytransformまたはfilterデータフレームまたはシリーズに戻って取得します。

列Aの値で並べ替えるだけの場合は、を使用する必要がありますdf.sort('A')


4
head実際に実行してhead(5)いるのは、最初の5行を表示していることであり、「表示」フレームにより正確であることに注意してくださいdf.groupby('A').apply(lambda x: x)。これは事実上パススルーです。pass()たぶん、あなたは方法を持つことができると思います。
ジェフ

13

別の簡単な代替案:

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

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

良い洞察をしてくれたスーリヤに感謝します。私は彼の解決策をクリーンアップし、単に行います:

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

2

groupByデータをprintステートメントで直接確認することはできませんが、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)

これをgroupbyの結果として試した後、出力が得られます

それが役に立てば幸い


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')次に、list(df_g)を呼び出すか、最初のグループを呼び出したい場合はlist(df_g)[0]を呼び出します。これはPythonよりもRが好きなところの1つです。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オブジェクトの代わりにデータフレームを返すので、プロはとても簡単に印刷できます。そして、出力は美しく見えます。欠点は、一連の冗長データを作成することです。


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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.