web-dev-qa-db-ja.com

Pandas Groupby関数の列名の名前変更

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

ご覧のとおり、集計変数 'c​​ount'の名前をSQLのTotal_Numbersに変更するのは非常に簡単です。 Pandasで同じことをしたかったのですが、group-by関数でそのようなオプションが見つかりませんでした。誰か助けてもらえますか?

2)。 2番目の質問とそれ以上の観察は、引用符で囲まずにPandas dataframe関数で列名を直接使用できるかということです。変数名は文字列であるため、引用符の内側にありますが、外側のデータフレーム関数を使用し、属性として引用符の内側にする必要がない場合、df.ID.sum()などのようになります。dfのようなDataFrame関数で使用する場合のみです。 sort()またはdf.groupbyを引用符内で使用する必要があります。これは、SQLやSASまたは他の言語で引用符を付けずに変数名を使用するだけのように、実際には少し苦痛です。これに関する提案はありますか?

上記の2つのポイント(1つめはメイン、2つめは意見)についてお勧めします。

ありがとう

42
Baktaawar

最初の質問に対する答えは次のようになります。

<your DataFrame>.rename(columns={'count':'Total_Numbers'})

または

<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers']

2つ目は、答えはノーだと思います。 python datamodel のため、「df.ID」のように使用できます。

属性参照は、この辞書のルックアップに変換されます。たとえば、m.xはm。dict["x"]と同等です。

45
Roman Pekar

Groupby操作の後に列名を変更するための現在の(バージョン0.20以降)メソッドは、renameメソッドをチェーンすることです。詳細については、ドキュメントの この非推奨ノート を参照してください。

pandasバージョン0.20以降の非推奨の回答

これはグーグルでの最初の結果であり、トップアンサーは機能しますが、実際には質問に答えません。 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_でグループ化し、列Cmeanmedianで集計し、列Dmaxで集計するとします。次のコードはこれを行います。

_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)を使用してトップレベルを削除できる階層インデックスは残ります。

23
Ted Petrou