68

Q1) groupby、SQL スタイルの集計を行い、出力列の名前を変更したい:

データセットの例:

>>> 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ます。だから私はこのようなものを使用しました...Regioncount

>>> 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 のような」出力を得ることができます。私の問題は、ここで集計変数の名前を変更countできないことです。したがって、SQLで上記のことをしたい場合は、次のようにします。

select ID, Region, sum(count) as Total_Numbers
from df
group by ID, Region
order by ID, Region

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

2番目の質問(より観察)は...

Q2) Pandas データフレーム関数で列名を引用符で囲まずに直接使用することは可能ですか?

変数名は文字列であるため、引用符で囲む必要があることは理解していますが、それらをデータフレーム関数の外で使用し、属性として引用符で囲む必要がないかどうかがわかります。df.ID.sum()など。DataFrame関数で使用する場合、またはdf.sort()引用df.groupby符内で使用する必要がある場合のみです。SQL や SAS などの言語では、引用符を付けずに変数名を使用するだけなので、これは実際には少し面倒です。これに関する提案はありますか?

両方の質問に親切に回答してください (Q1 がメインで、Q2 が意見です)。

4

2 に答える 2

40

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

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

これはグーグルでの最初の結果であり、トップの回答は機能しますが、実際には質問に回答していません. ここにはより良い答えがあり、辞書をメソッドに渡す完全な機能についてのgithubに関する長い議論があります。agg

残念ながら、これらの回答はドキュメントにはありませんが、列のグループ化、集約、および名前の変更の一般的な形式では、辞書の辞書が使用されます。外部ディクショナリへのキーは、集計される列名です。内部ディクショナリには、集計関数としての値を持つ新しい列名のキーがあります。

そこに到達する前に、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集約し、列を で集約したいとします。次のコードはこれを行います。CmeanmedianDmax

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)

于 2016-12-04T18:35:21.367 に答える