2017-09-27 58 views
3

例如,我有一個熊貓數據框如下:插入行作爲GROUPBY操作的結果到原始數據幀

col_1 col_2 col_3 col_4 
a  X  5  1 
a  Y  3  2 
a  Z  6  4 
b  X  7  8 
b  Y  4  3 
b  Z  6  5 

而且我想,在COL_1每個值,在col_3添加值和COL_4(以及更多列),它們與col_2中的X和Z相對應,並使用這些值創建一個新行。所以輸出會如下:

col_1 col_2 col_3 col_4 
a  X  5  1 
a  Y  3  2 
a  Z  6  4 
a  NEW  11  5 
b  X  7  8 
b  Y  4  3 
b  Z  6  5 
b  NEW  13  13 

而且,有可能是在COL_1更多的價值,這將需要相同的待遇,所以我不能明確地引用「A」和「B」。我試圖使用groupby('col_1')和apply()的組合,但是我無法使其工作。我已經足夠接近下面的內容了,但是我無法在col_2中添加「新」,並將原始值(a或b等)保留在col_1中。

df.append(df[(df['col_2'] == 'X') | (df['col_2'] == 'Z')].groupby('col_1').mean()) 

謝謝。

+0

你能保證X和Z只出現在一個組中嗎? –

+0

是的,在col_1中每個值總是3行,col_2中的X,Y和Z只有一次。 col_4之後的列數不確定,但它總是一個列,需要按照與col_3和col_4相同的方式進行處理,即X和Z的總和。 – Saturate

回答

1

如果你能保證XZ一組中只出現一次,你可以使用一個groupbypd.concat操作:

new = df[df.col_2.isin(['X', 'Z'])]\ 
     .groupby(['col_1'], as_index=False).sum()\ 
     .assign(col_2='NEW') 

df = pd.concat([df, new]).sort_values('col_1') 

df 
    col_1 col_2 col_3 col_4 
0  a  X  5  1 
1  a  Y  3  2 
2  a  Z  6  4 
0  a NEW  11  5 
3  b  X  7  8 
4  b  Y  4  3 
5  b  Z  6  5 
1  b NEW  13  13 
+0

@COLDSPEED,效果很好。我現在將如何應用自定義函數而不是sum()。所以,如果我需要用X除以Z例如? – Saturate

+0

@Saturate我認爲這有點困難。我認爲你需要在內部使用拉姆達來進行分組。你可以打開另一個問題嗎? –

0

下面的代碼做的:

import pandas as pd 

def sum_group(df): 
    dfxz = df[df.col_2.isin(['X','Z'])] 
    sum_row = pd.Series(
    [ 
     df.col_1.iloc[0], 
     'NEW', 
     dfxz.col_3.sum(), 
     dfxz.col_4.sum() 
    ], index = dfxz.columns) 
    return df.append(sum_row, ignore_index=True) 

df = pd.DataFrame([['a', 'X', 5, 1], 
        ['a', 'Y', 3, 2], 
        ['a', 'Z', 6, 4], 
        ['b', 'X', 7, 8], 
        ['b', 'Y', 4, 3], 
        ['b', 'Z', 6, 5]], 
        columns = ['col_1','col_2','col_3','col_4']) 

df = df.groupby('col_1').apply(
    sum_group, 
).reset_index(drop=True) 

print df 

applygroupby對象的方法調用返回數據幀的函數sum_group。數據幀然後連接成單個數據幀。 sum_group將輸入數據幀與另一行sum_row並列,其中包含根據所述標準縮減版本的數據幀。