2015-09-16 68 views
3

我有一個數據幀DF這樣的:Pandas Dataframe:如何通過應用函數來更新多列?

A B C D 
2 1 O s h 
4 2 P  
7 3 Q 
9 4 R h m 

我有一個函數f來計算C和d基於B行:

def f(p): #p is the value of column B for a row. 
    return p+'k', p+'n' 

我怎麼能填充用於行的缺失值4 & 7通過將函數f應用於Dataframe?

預期的結果是象下面這樣:

A B C D 
2 1 O s h 
4 2 P Pk Pn 
7 3 Q Qk Qn 
9 4 R h m 

函數f有可能被用來作爲真正的功能是非常複雜的。此外,該功能只需要適用於缺少C和d

+0

願你更新與功能齊全的問題,爲了再現執行以下操作

df.C.loc[df.C.isnull()] = df.B.loc[df.C.isnull()] + 'k' df.D.loc[df.D.isnull()] = df.B.loc[df.D.isnull()] + 'n' 

檢查此鏈接indexing-view-versus-copy整個代碼? –

+0

向函數添加了虛擬邏輯,以便返回2個值。 –

+1

預期產量是多少?對不起,但我真的沒有得到你的功能.. –

回答

2

也許還有一個更優雅的方式,但我會用這種方式做行:

df['C'] = df['B'].apply(lambda x: f(x)[0]) 
df['D'] = df['B'].apply(lambda x: f(x)[1]) 

應用的功能列和獲得輸出的第一個和第二個值。它返回:

A B C D 
0 1 O Ok On 
1 2 P Pk Pn 
2 3 Q Qk Qn 
3 4 R Rk Rn 

編輯:

在一個更簡潔的方式,這要歸功於this answer

df[['C','D']] = df['B'].apply(lambda x: pd.Series([f(x)[0],f(x)[1]])) 
+0

函數f必須使用,因爲實函數非常複雜。此外,該功能只需應用於缺少C和D的行。 –

+0

只要函數返回兩個參數,它就應該以這種方式工作。 –

+0

謝謝@Fiabetto。我們如何才能將函數應用於C和D中僅缺失行的值? –

2

如果你想使用你的函數這樣,這裏是一個內襯:

df.update(df.B.apply(lambda x: pd.Series(dict(zip(['C','D'],f(x))))), overwrite=False) 

In [350]: df 
Out[350]: 
    A B C D 
2 1 O s h 
4 2 P Pk Pn 
7 3 Q Qk Qn 
9 4 R h m 

您還可以:

df1 = df.copy() 

df[['C','D']] = df.apply(lambda x: pd.Series([x['B'] + 'k', x['B'] + 'n']), axis=1) 

df1.update(df, overwrite=False) 
+0

這看起來不錯,但它不使用函數f。 –

+0

解決方案現在使用你的函數f而不需要重新調節它! –

0

只需如果你想知道爲什麼我用loc

相關問題