2017-10-10 72 views
1

我有一個有兩列的數據框。我想創建一個第三列,例如,如果Col1中爲null,則COL3 = col2的,否則COL3 = Col1中* 2如何創建一個列作爲其他兩個函數?

我曾嘗試:

def myf(col1,col2): 
     if pd.isnull(col1): 
      return col2 
     else: 
      return col1 * 2 

    df['col3'] = df.apply(lambda x: myf(df['col1'], df['col2']), axis= 1) 

但我得到一個錯誤,「「的一個系列的真實價值是不明確的「。

我該如何解決這個問題? 我知道這是一個平庸的問題,但我的微小的習慣於SQL的大腦仍然在努力(大時間!)以瞭解熊貓的工作原理;也許我很愚蠢,也許熊貓的文檔很差,也許都:)

據我所知,適用於DataFrame的行/列的基礎上,applymap工作元素明智的DataFrame和地圖作品元素在一個系列,我知道錯誤出現,因爲pd.isnull返回一個T/F數組。

但是,我不知道如何在像這樣的情況下使用applymap或map,其中兩個其他列是我的輸入。

謝謝!

+1

相反做'DF [ 'COL3'] = np.where(df.Col1.isnull(),df.Col2,df.Col1 * 2) ' – Zero

回答

1

需要lambda function在功能改變dfx標量代替Series作爲輸入:

df['col3'] = df.apply(lambda x: myf(x['col1'], x['col2']), axis= 1) 

另一個更快的解決方案是用combine_firstSeries.where

df['col3'] = df['col1'].mul(2).combine_first(df['col2']) 

df['Col3'] = df['col2'].where(df['col1'].isnull(), df['col1']*2) 
2

可以使用fillna

df.col1.mul(2).fillna(df.col2) 

df = pd.DataFrame({ 
    'col1': [1, 2, pd.np.nan, 3, pd.np.nan], 
    'col2': [2, pd.np.nan, 3, 2, pd.np.nan] 
}) 

df['col3'] = df.col1.mul(2).fillna(df.col2) 
df 
# col1 col2 col3 
#0 1.0 2.0 2.0 
#1 2.0 NaN 4.0 
#2 NaN 3.0 3.0 
#3 3.0 2.0 6.0 
#4 NaN NaN NaN 
相關問題