1)。次のデータセットの例があります。
>>> df
ID Region count
0 100 Asia 2
1 101 Europe 3
2 102 US 1
3 103 Africa 5
4 100 Russia 5
5 101 Australia 7
6 102 US 8
7 104 Asia 10
8 105 Europe 11
9 110 Africa 23
このデータセットの観測値を地域IDでグループ化し、各グループのカウントを合計したかったのです。だから私はこのようなものを使用しました:
>>> print(df.groupby(['ID','Region'],as_index=False).count().sum())
ID Region count
0 100 Asia 2
1 100 Russia 5
2 101 Australia 7
3 101 Europe 3
4 102 US 9
5 103 Africa 5
6 104 Asia 10
7 105 Europe 11
8 110 Africa 23
As_index = Falseを使用すると、「SQL-Like」出力を取得できます。私の問題は、集計変数カウントの名前をここで変更できないことです。したがって、SQLで上記のことをしたい場合は、次のようなことをします:
select ID, Region, sum(count) as Total_Numbers
from df
group by ID, Region
order by ID, Region
ご覧のとおり、集計変数 'count'の名前をSQLのTotal_Numbersに変更するのは非常に簡単です。 Pandasで同じことをしたかったのですが、group-by関数でそのようなオプションが見つかりませんでした。誰か助けてもらえますか?
2)。 2番目の質問とそれ以上の観察は、引用符で囲まずにPandas dataframe関数で列名を直接使用できるかということです。変数名は文字列であるため、引用符の内側にありますが、外側のデータフレーム関数を使用し、属性として引用符の内側にする必要がない場合、df.ID.sum()などのようになります。dfのようなDataFrame関数で使用する場合のみです。 sort()またはdf.groupbyを引用符内で使用する必要があります。これは、SQLやSASまたは他の言語で引用符を付けずに変数名を使用するだけのように、実際には少し苦痛です。これに関する提案はありますか?
上記の2つのポイント(1つめはメイン、2つめは意見)についてお勧めします。
ありがとう
最初の質問に対する答えは次のようになります。
<your DataFrame>.rename(columns={'count':'Total_Numbers'})
または
<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers']
2つ目は、答えはノーだと思います。 python datamodel のため、「df.ID」のように使用できます。
属性参照は、この辞書のルックアップに変換されます。たとえば、m.xはm。dict["x"]と同等です。
Groupby操作の後に列名を変更するための現在の(バージョン0.20以降)メソッドは、rename
メソッドをチェーンすることです。詳細については、ドキュメントの この非推奨ノート を参照してください。
これはグーグルでの最初の結果であり、トップアンサーは機能しますが、実際には質問に答えません。 agg
メソッドに辞書を渡す完全な機能については、 ここでより良い答え と長い githubでの議論 があります。
残念ながら、これらの回答はドキュメントには存在しませんが、列のグループ化、集計、および名前変更の一般的な形式では、辞書の辞書が使用されます。外部ディクショナリのキーは、集計される列名です。内部ディクショナリには、集計関数として値を持つ新しい列名のキーがあります。
そこに着く前に、4列のDataFrameを作成しましょう。
_df = pd.DataFrame({'A' : list('wwwwxxxx'),
'B':list('yyzzyyzz'),
'C':np.random.Rand(8),
'D':np.random.Rand(8)})
A B C D
0 w y 0.643784 0.828486
1 w y 0.308682 0.994078
2 w z 0.518000 0.725663
3 w z 0.486656 0.259547
4 x y 0.089913 0.238452
5 x y 0.688177 0.753107
6 x z 0.955035 0.462677
7 x z 0.892066 0.368850
_
列_A, B
_でグループ化し、列C
をmean
とmedian
で集計し、列D
をmax
で集計するとします。次のコードはこれを行います。
_df.groupby(['A', 'B']).agg({'C':['mean', 'median'], 'D':'max'})
D C
max mean median
A B
w y 0.994078 0.476233 0.476233
z 0.725663 0.502328 0.502328
x y 0.753107 0.389045 0.389045
z 0.462677 0.923551 0.923551
_
これは、階層インデックスを持つDataFrameを返します。元の質問では、同じ手順で列の名前を変更することについて尋ねました。これは辞書の辞書を使用して可能です:
_df.groupby(['A', 'B']).agg({'C':{'C_mean': 'mean', 'C_median': 'median'},
'D':{'D_max': 'max'}})
D C
D_max C_mean C_median
A B
w y 0.994078 0.476233 0.476233
z 0.725663 0.502328 0.502328
x y 0.753107 0.389045 0.389045
z 0.462677 0.923551 0.923551
_
これにより、すべての列の名前が一度に変更されますが、df.columns = df.columns.droplevel(0)
を使用してトップレベルを削除できる階層インデックスは残ります。