web-dev-qa-db-ja.com

Python Pandas:groupby()とagg()を使用しても順序は保持されますか?

私はdata.frameのすべての列で要約統計を実行するために、よく使用されているパンダのagg()関数を使用しました。たとえば、平均と標準偏差を生成する方法は次のとおりです。

df = pd.DataFrame({'A': ['group1', 'group1', 'group2', 'group2', 'group3', 'group3'],
                   'B': [10, 12, 10, 25, 10, 12],
                   'C': [100, 102, 100, 250, 100, 102]})

>>> df
[output]
        A   B    C
0  group1  10  100
1  group1  12  102
2  group2  10  100
3  group2  25  250
4  group3  10  100
5  group3  12  102

どちらの場合も、個々の行がagg関数に送信される順序は重要ではありません。ただし、次の例について考えてみます。

df.groupby('A').agg([np.mean, lambda x: x.iloc[1] ])

[output]

        mean  <lambda>  mean  <lambda>
A                                     
group1  11.0        12   101       102
group2  17.5        25   175       250
group3  11.0        12   101       102

この場合、ラムダは意図したとおりに機能し、各グループの2行目を出力します。ただし、pandasのドキュメントでは、これがすべての場合に当てはまることが保証されていることを意味します。)を見つけることができませんでした。agg()と加重平均関数なので、関数に入ってくる行が元のデータフレームに表示されるのと同じ順序になるようにしたいと思います。

誰かが知っている、理想的にはドキュメントのどこかまたはpandasソースコード、これが事実であることが保証されている場合)

29
BringMyCakeBack

この拡張機能を参照 issue

短い答えは「はい」です。groupbyは渡された順序を保持します。次のような例を使用して、これを証明できます。

_In [20]: df.sort_index(ascending=False).groupby('A').agg([np.mean, lambda x: x.iloc[1] ])
Out[20]: 
           B             C         
        mean <lambda> mean <lambda>
A                                  
group1  11.0       10  101      100
group2  17.5       10  175      100
group3  11.0       10  101      100
_

ただし、これはリサンプルには当てはまりません。単調なインデックスが必要なためです(非単調なインデックスでも機能しますが、最初にソートされます)。

それらはgroupbyに対する_sort=_フラグですが、これはグループ自体の並べ替えに関係し、グループ内の観測には関係しません。

参考:df.groupby('A').nth(1)は、グループの2番目の値を取得する安全な方法です(グループの要素が2つ未満の場合、上記のメソッドは失敗します)。

17
Jeff

Pandaの0.19.1ドキュメントは「groupbyは各グループ内の行の順序を保持する」と述べているため、これは動作が保証されています。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html

7
Uwe Mayer

順序を維持するには、.groupby(..., sort=False)を渡す必要があります。あなたの場合、グループ化列はすでにソートされているので、違いはありませんが、通常はsort=Falseフラグを使用する必要があります。

 df.groupby('A', sort=False).agg([np.mean, lambda x: x.iloc[1] ])
1
Dima Lituiev

さらに簡単:

  import pandas as pd
  pd.pivot_table(df,index='A',aggfunc=(np.mean))

出力:

            B    C
     A                
   group1  11.0  101
   group2  17.5  175
   group3  11.0  101
0
TinaW

リファレンス: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

APIは引数として「SORT」を受け入れます。

SORT引数の説明は次のとおりです。

sort:bool、デフォルトはTrueソートグループキー。これをオフにすると、パフォーマンスが向上します。これは、各グループ内の観測の順序に影響を与えないことに注意してください。 Groupbyは、各グループ内の行の順序を保持します

したがって、「Groupby」が各グループ内の行の順序を維持することは明らかです。

0
Jigidi Sarnath