私は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ソースコード、これが事実であることが保証されている場合)
この拡張機能を参照 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つ未満の場合、上記のメソッドは失敗します)。
Pandaの0.19.1ドキュメントは「groupbyは各グループ内の行の順序を保持する」と述べているため、これは動作が保証されています。
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html
順序を維持するには、.groupby(..., sort=False)
を渡す必要があります。あなたの場合、グループ化列はすでにソートされているので、違いはありませんが、通常はsort=False
フラグを使用する必要があります。
df.groupby('A', sort=False).agg([np.mean, lambda x: x.iloc[1] ])
さらに簡単:
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
リファレンス: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html
APIは引数として「SORT」を受け入れます。
SORT引数の説明は次のとおりです。
sort:bool、デフォルトはTrueソートグループキー。これをオフにすると、パフォーマンスが向上します。これは、各グループ内の観測の順序に影響を与えないことに注意してください。 Groupbyは、各グループ内の行の順序を保持します。
したがって、「Groupby」が各グループ内の行の順序を維持することは明らかです。