2017-08-29 13 views
4

パンダのデータフレームをグループ化した後で列に集計する方法はありますか?たとえば、私は、次のデータフレームを有する:パンダのデータフレームの集計の列

ID W_1  W_2  W_3 
1 0.1  0.2  0.3 
1 0.2  0.4  0.5 
2 0.3  0.3  0.2 
2 0.1  0.3  0.4 
2 0.2  0.0  0.5 
1 0.5  0.3  0.2 
1 0.4  0.2  0.1 

を私はすべての列(W_1、W_2、W_3)の最初の行を合計「my_sum」と呼ばれる追加の列を持っていたいです。出力はこのようなものになるだろう:

ID W_1  W_2  W_3  my_sum 
1 0.1  0.2  0.3  0.6 
1 0.2  0.4  0.5  1.1 
2 0.3  0.3  0.2  0.8 
2 0.1  0.3  0.4  0.8 
2 0.2  0.0  0.5  0.7 
1 0.5  0.3  0.2  1.0 
1 0.4  0.2  0.1  0.7 

私は、次のTRED:

df['my_sum'] = df.groupby('ID')['W_1','W_1','W_1'].transform(sum,axis=1) 

をが、これは単にW_1のすべてのエントリを合計します。 documentationには軸のパルメータが記載されていますが、なぜ効果がないのか分かりません。

私はこのquestionthisを調べましたが、それらは私が望むものとは異なります。

答えて

3

同じで.sum(1)で残っているものである場合。すでに投稿されている回答のいくつかの発明的な代替案があります。


オプション1

使用df.blocks

df['my_sum'] = df.blocks['float64'].sum(1)  
df  
    ID W_1 W_2 W_3 my_sum 
0 1 0.1 0.2 0.3  0.6 
1 1 0.2 0.4 0.5  1.1 
2 2 0.3 0.3 0.2  0.8 
3 2 0.1 0.3 0.4  0.8 
4 2 0.2 0.0 0.5  0.7 
5 1 0.5 0.3 0.2  1.0 
6 1 0.4 0.2 0.1  0.7 

オプション2

使用df.iloc

df['my_sum'] = df.iloc[:, 1:].sum(1) 
df 
    ID W_1 W_2 W_3 my_sum 
0 1 0.1 0.2 0.3  0.6 
1 1 0.2 0.4 0.5  1.1 
2 2 0.3 0.3 0.2  0.8 
3 2 0.1 0.3 0.4  0.8 
4 2 0.2 0.0 0.5  0.7 
5 1 0.5 0.3 0.2  1.0 
6 1 0.4 0.2 0.1  0.7 

オプション3

不愉快boolean indexingを使用してデータを悪用:

df['my_sum'] = df[df < 1].sum(1) 
df 
    ID W_1 W_2 W_3 my_sum 
0 1 0.1 0.2 0.3  0.6 
1 1 0.2 0.4 0.5  1.1 
2 2 0.3 0.3 0.2  0.8 
3 2 0.1 0.3 0.4  0.8 
4 2 0.2 0.0 0.5  0.7 
5 1 0.5 0.3 0.2  1.0 
6 1 0.4 0.2 0.1  0.7 

オプション4

これはnumpyの配列に加算し、高速である必要があります:

df['my_sum'] = df.values[:, 1:].sum(1) 
df 
    ID W_1 W_2 W_3 my_sum 
0 1 0.1 0.2 0.3  0.6 
1 1 0.2 0.4 0.5  1.1 
2 2 0.3 0.3 0.2  0.8 
3 2 0.1 0.3 0.4  0.8 
4 2 0.2 0.0 0.5  0.7 
5 1 0.5 0.3 0.2  1.0 
6 1 0.4 0.2 0.1  0.7 

オプション5

df.columns.str.contains - 列名のフィルタ:

df.iloc[:, df.columns.str.contains('W_')].sum(1) 
df 
    ID W_1 W_2 W_3 my_sum 
0 1 0.1 0.2 0.3  0.6 
1 1 0.2 0.4 0.5  1.1 
2 2 0.3 0.3 0.2  0.8 
3 2 0.1 0.3 0.4  0.8 
4 2 0.2 0.0 0.5  0.7 
5 1 0.5 0.3 0.2  1.0 
6 1 0.4 0.2 0.1  0.7 
4
In [7]: df['my_sum'] = df.drop('ID',1).sum(axis=1) 

In [8]: df 
Out[8]: 
    ID W_1 W_2 W_3 my_sum 
0 1 0.1 0.2 0.3  0.6 
1 1 0.2 0.4 0.5  1.1 
2 2 0.3 0.3 0.2  0.8 
3 2 0.1 0.3 0.4  0.8 
4 2 0.2 0.0 0.5  0.7 
5 1 0.5 0.3 0.2  1.0 
6 1 0.4 0.2 0.1  0.7 

か:

In [9]: df['my_sum'] = df.filter(regex='^W_\d+').sum(axis=1) 

In [10]: df 
Out[10]: 
    ID W_1 W_2 W_3 my_sum 
0 1 0.1 0.2 0.3  0.6 
1 1 0.2 0.4 0.5  1.1 
2 2 0.3 0.3 0.2  0.8 
3 2 0.1 0.3 0.4  0.8 
4 2 0.2 0.0 0.5  0.7 
5 1 0.5 0.3 0.2  1.0 
6 1 0.4 0.2 0.1  0.7 
4

あなただけの行全体で合計したい場合は、何によってグループには必要ありません。合計でaxis=1を使用してください。

重要な点は、合計する列を特定する方法です。あなたの場合、さまざまな方法で適切な列を選ぶことができます。実際のデータがどのようなものかはわかりません。


@マックスはもっと実用的な解決方法をカバーしています。これは速くなければなりません。

df.assign(
    my_sum=np.column_stack([df[c].values for c in df if c.startswith('W_')]).sum(1) 
) 

    ID W_1 W_2 W_3 my_sum 
0 1 0.1 0.2 0.3  0.6 
1 1 0.2 0.4 0.5  1.1 
2 2 0.3 0.3 0.2  0.8 
3 2 0.1 0.3 0.4  0.8 
4 2 0.2 0.0 0.5  0.7 
5 1 0.5 0.3 0.2  1.0 
6 1 0.4 0.2 0.1  0.7 

それとも、本当にただ['W_1', 'W_2', 'W_3']

df.assign(my_sum=df[['W_1', 'W_2', 'W_3']].sum(1)) 

    ID W_1 W_2 W_3 my_sum 
0 1 0.1 0.2 0.3  0.6 
1 1 0.2 0.4 0.5  1.1 
2 2 0.3 0.3 0.2  0.8 
3 2 0.1 0.3 0.4  0.8 
4 2 0.2 0.0 0.5  0.7 
5 1 0.5 0.3 0.2  1.0 
6 1 0.4 0.2 0.1  0.7 
+0

私の答えの求めて多くあなたのように通常は行います。 –

+0

だからこそあなたは私の投票権を得ました( - : – piRSquared

関連する問題