2016-09-26 112 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