2017-08-29 73 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 

我想有一個名爲「my_sum」一個額外的列求和的第一行中的所有列(W_1,W_2,W_3)。輸出會是這樣的:

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即可。

關鍵是弄清楚如何識別哪些列進行求和。就你而言,我們可以通過多種方式選擇合適的列。我們實際上並不知道你的「真實」數據是什麼樣子的。


@MaxU涵蓋了更實際的解決方案。這個應該很快。

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

相關問題