2016-09-26 42 views
1

基於this問題,我想知道如何使用def()來計算Pandas的新列並使用多個參數(字符串和整數)?用Pandas計算新列

具體的例子:

df_joined["IVbest"] = IV(df_joined["Saison"], df_joined["Wald_Typ"], df_joined["NS_Cap"]) 

「賽鬆」,「Wald_Typ」都是字符串「NS_Cap」是一個整數

現在我想運行通過這個定義所有這些值,並再次回到我的X價值:

def IV(saison, wald, ns): 
    if saison == "Sommer": 
     if wald == "Laubwald": 
      x = ns * 0.1 
     elif wald == "Nadelwald": 
      x = ns * 0.2 
     elif wald == "Mischwald": 
      x = ns * 0.3 
    elif saison == "Winter": 
     if wald == "Laubwald": 
      x = ns * 0.01 
     elif wald == "Nadelwald": 
      x = ns * 0.02 
     elif wald == "Mischwald": 
      x = ns * 0.03 
    return x 

我該如何做到最好?像

df_joined["IVbest"] = IV(df_joined["Saison", "Wald_Typ", "NS_Cap"]) 

df_joined["IVbest"] = df_joined["Saison", "Wald_Typ", "NS_Cap"].apply(IV) 

但沒有

我已經試過的東西的工作:(

+1

您需要將'axis = 1'傳遞給'apply':'df_joined [「IVbest」] = df_joined [[「Saison」,「Wald_Typ」,「NS_Cap」]]。apply(lambda x:IV(x [ Saison「],x [」Wald_Typ「],x [」NS_Cap「]),axis = 1)' – EdChum

+0

如果您將簽名更改爲」def IV(df):#do df ['saison'],df ['wald']和df ['ns']'返回一個系列' – EdChum

+0

謝謝埃德!你的第一個例子效果很好。如果我希望輸出是一個整數?我可以將類似int(round(xy))的東西應用於輸出嗎?我肯定會考慮你的其他想法! – Khaled

回答

0

我覺得在這種情況下,這將是更好地使用6個口罩,並利用這些僅對這些行執行計算:

sommer_laub = (df_joined['Saison'] == 'Sommer') & (df_joined['Wald_Typ'] == 'Laubwald') 
sommer_nadel = (df_joined['Saison'] == 'Sommer') & (df_joined['Wald_Typ'] == 'Nadelwald') 
sommer_misch = (df_joined['Saison'] == 'Sommer') & (df_joined['Wald_Typ'] == 'Mischwald') 
winter_laub = (df_joined['Saison'] == 'Winter') & (df_joined['Wald_Typ'] == 'Laubwald') 
winter_nadel = (df_joined['Saison'] == 'Winter') & (df_joined['Wald_Typ'] == 'Nadelwald') 
winter_misch = (df_joined['Saison'] == 'Winter') & (df_joined['Wald_Typ'] == 'Mischwald') 
df.loc[sommer_laub, 'IVbest'] = df.loc[sommer_laub,'NS_Cap'] * 0.1 
df.loc[sommer_nadel, 'IVbest'] = df.loc[sommer_nadel,'NS_Cap'] * 0.2 
df.loc[sommer_misch, 'IVbest'] = df.loc[sommer_misch,'NS_Cap'] * 0.3 
df.loc[winter_laub, 'IVbest'] = df.loc[winter_laub,'NS_Cap'] * 0.01 
df.loc[winter_nadel, 'IVbest'] = df.loc[winter_nadel,'NS_Cap'] * 0.02 
df.loc[winter_misch, 'IVbest'] = df.loc[winter_misch,'NS_Cap'] * 0.03 
+0

感謝您以這種方式展示我。但爲什麼它更好?更快或更優雅? – Khaled

+0

更快,這將在每個面具的感興趣的行上工作,您的方法需要查看每行並分別評估您的布爾條件,這對於較大的df來說會較慢 – EdChum

+0

大,越來越多數據池變得越來越複雜。這麼快就好了:-) – Khaled