2016-08-09 16 views
10

pandas.DataFrame.groupbyには、引数group_keysがあります。これは、グループキーがデータフレームサブセットにどのように含まれているかに関するものです。pandas.groupbyのgroup_keys引数は実際に何をしますか?

group_keysブール、デフォルトはTrue

適用呼び出し、しかし作品

を識別するためのインデックスにグループキーを追加し、私の文書によると、 group_keysが実際の違いをもたらす例は実際には見つかりません:

import pandas as pd 

df = pd.DataFrame([[0, 1, 3], 
        [3, 1, 1], 
        [3, 0, 0], 
        [2, 3, 3], 
        [2, 1, 0]], columns=list('xyz')) 

gby = df.groupby('x') 
gby_k = df.groupby('x', group_keys=False) 

それはapplyの出力に差がありません:

ap = gby.apply(pd.DataFrame.sum) 
# x y z 
# x   
# 0 0 1 3 
# 2 4 4 3 
# 3 6 1 1 

ap_k = gby_k.apply(pd.DataFrame.sum) 
# x y z 
# x   
# 0 0 1 3 
# 2 4 4 3 
# 3 6 1 1 

そして、あなたが行くようにあなたがグループ化されたサブセットをプリントアウトしても、結果はまだ同じです:

def printer_func(x): 
    print(x) 
    return x 

print('gby') 
print('--------------') 
gby.apply(printer_func) 
print('--------------') 

print('gby_k') 
print('--------------') 
gby_k.apply(printer_func) 
print('--------------') 

# gby 
# -------------- 
# x y z 
# 0 0 1 3 
# x y z 
# 0 0 1 3 
# x y z 
# 3 2 3 3 
# 4 2 1 0 
# x y z 
# 1 3 1 1 
# 2 3 0 0 
# -------------- 
# gby_k 
# -------------- 
# x y z 
# 0 0 1 3 
# x y z 
# 0 0 1 3 
# x y z 
# 3 2 3 3 
# 4 2 1 0 
# x y z 
# 1 3 1 1 
# 2 3 0 0 
# -------------- 

デフォルトの引数が実際にはTrueである可能性を考えましたが、group_keysを明示的にFalseに切り替えることで違いはありません。この議論はまさに何を意味するのでしょうか?

pandasバージョン0.18.1上のファイル名を指定して実行)

編集: 私はgroup_keysthis answerに基づいて、動作を変更する方法を見つけた:

import pandas as pd 
import numpy as np 

row_idx = pd.MultiIndex.from_product(((0, 1), (2, 3, 4))) 
d = pd.DataFrame([[4, 3], [1, 3], [1, 1], [2, 4], [0, 1], [4, 2]], index=row_idx) 

df_n = d.groupby(level=0).apply(lambda x: x.nlargest(2, [0])) 
#  0 1 
# 0 0 2 4 3 
#  3 1 3 
# 1 1 4 4 2 
#  2 2 4 

df_k = d.groupby(level=0, group_keys=False).apply(lambda x: x.nlargest(2, [0])) 

#  0 1 
# 0 2 4 3 
# 3 1 3 
# 1 4 4 2 
# 2 2 4 

しかし、私は明らかにまだいませんよgroup_keysとなりますので、理解できる原則はです。この動作は、@piRSquaredの回答に基づいて直感的に見えません。

答えて

1

インデックスを保持する関数を渡す場合、pandasはその情報を保持しようとします。しかし、インデックス情報のすべての類似点を削除する関数を渡すと、group_keys=Trueはその情報を保持することができます。

使用この代わりに

f = lambda df: df.reset_index(drop=True) 

次に異なるgroupby

gby.apply(lambda df: df.reset_index(drop=True)) 

enter image description here

gby_k.apply(lambda df: df.reset_index(drop=True)) 

enter image description here

+0

ありがとうございます!これは 'group_keys'の機能の最大限ですか?私は 'group_keys'が何かをする別の例で質問を編集しましたが、あなたがここで述べた' group_keys'の意味とは一貫していないようです。 – Paul

5

group_keysのパラメータがgroupbyの場合、グループ化された列[group_keys=True]に対応する追加のインデックス列を作成し、特に[group_keys=False]の場合、個々の列に対して操作を実行しようとしている間に、

その一例:その

In [21]: gby = df.groupby('x',group_keys=True).apply(lambda row: row['x']) 

In [22]: gby 
Out[22]: 
x 
0 0 0 
2 3 2 
    4 2 
3 1 3 
    2 3 
Name: x, dtype: int64 

In [23]: gby_k = df.groupby('x', group_keys=False).apply(lambda row: row['x']) 

In [24]: gby_k 
Out[24]: 
0 0 
3 2 
4 2 
1 3 
2 3 
Name: x, dtype: int64 

一つが意図のアプリケーションはMulti-indexデータフレームオブジェクトに変換することにより、階層のレベルのいずれかでグループになり得ます。

In [27]: gby.groupby(level='x').sum() 
Out[27]: 
x 
0 0 
2 4 
3 6 
Name: x, dtype: int64 
+0

Hmmm ..ここで 'group_key'が何を意味しているのか分からないような気がします。このような特定の動作をしているのはなぜですか** **グループ化された列がある場合のみ** 'apply'関数が' Series'を返すときにのみマルチインデックスを作成するようですが、なぜそれは分かりません。 – Paul

関連する問題