2017-08-04 43 views
3

計算我有數據幀是這樣的:的Python /大熊貓:基於單元格的值

A B C D E 
0 2 3 4 8 7 
1 4 7 5 9 4 
2 3 4 5 7 2 
3 8 9 1 3 7 

我需要做這樣的事情:

if 'value in column A' == 2: 
    'value for this row in new column' = 'value from column B' + 'value from column C' 
elif 'value in column A' == 4: 
    'value for this row in new column' = 'value from column B' + 'value from column D' 
elif 'value in column A' == 8: 
    'value for this row in new column' = 'value from column B' + 'value from column E' 
else: 
    'value for this row in new column' = 0 

我試圖做這幾種方法,例如:

1. 
df['sum'][df['A'] == 2] = df['B'] + df['C'] 
df['sum'][df['A'] == 4] = df['B'] + df['D'] 
df['sum'][df['A'] == 8] = df['B'] + df['E'] 

2. 
df.loc[df['A'] == 2, 'sum'] = df['B'] + df['C'] 
df.loc[df['A'] == 4, 'sum'] = df['B'] + df['D'] 
df.loc[df['A'] == 8, 'sum'] = df['B'] + df['E'] 

但我在結果中有空單元格。

+1

您的解決方案不處理其他cas即您可能需要將呼叫傳遞給[fillna](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html),例如'df.fillna(0,axis = 1)'在處理了前三種情況後。 – Quickbeam2k1

回答

5

做的另一種簡單的方法,這是我使用字典和lookup得到的總和即

colons = {2: 'C', 4: 'D', 8: 'E'} 
df['sum']= np.nan 
df['sum'] = df['B']+ df.lookup(df['A'].index,df['A'].map(colons).fillna('sum')) 

輸出:

 
    A B C D E sum 
0 2 3 4 8 7 7.0 
1 4 7 5 9 4 16.0 
2 3 4 5 7 2 NaN 
3 8 9 1 3 7 16.0 

您可以填寫楠0使用df.fillna(0)

+2

我在想這個。好的回答 – piRSquared

+0

謝謝先生! – Dark

1

這是一個方法

def f1(x): 
    if x['A']==2: 
     return x['B'] + x['C'] 
    elif x['A']==4: 
     return x['B'] + x['D'] 
    elif x['A']==8: 
     return x['B'] + x['E'] 
    else: 
     return 0 

df['sum'] = df.apply(f1 , axis=1) 
df.head() 

輸出:

A B C D E sum 
2 3 4 8 7 7 
4 7 5 9 4 16 
3 4 5 7 2 0 
8 9 1 3 7 16 
0

你得到的NA,因爲df.A == 3的情況下沒有被覆蓋。使用df.loc[:,'sum'] = 0 # or any other starting value避免這種

A =[2, 4, 3, 8] 
B =[3, 7, 4, 9] 
C =[4, 5, 5, 1] 
D =[8, 9, 7, 3] 
E =[7, 4, 2, 7] 

_all = [A,B,C,D,E] 
df = pd.DataFrame(_all, columns = ['A', 'B', 'C', 'D', 'E']) 

df.loc[:,'sum'] = 0 
df.loc[:,'sum'][df['A'] == 2] = df['B'] + df['C'] 
df.loc[:,'sum'][df['A'] == 4] = df['B'] + df['D'] 
df.loc[:,'sum'][df['A'] == 8] = df['B'] + df['E'] 

>>> df 
    A B C D E sum 
0 2 3 4 8 7 7 
1 4 7 5 9 4 16 
2 3 4 5 7 2 0 
3 8 9 1 3 7 16