【发布时间】:2017-02-03 20:25:28
【问题描述】:
基于this 问题,我想知道如何使用 def() 来计算 Pandas 的新列并使用多个参数(字符串和整数)?
具体例子:
df_joined["IVbest"] = IV(df_joined["Saison"], df_joined["Wald_Typ"], df_joined["NS_Cap"])
"Saison", "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)
但没有任何效果:(
【问题讨论】:
-
你需要将
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) -
如果您将签名更改为
def IV(df): #do stuff with df['saison'], df['wald'] and df['ns'],则您的def可以工作,返回一个系列` -
谢谢埃德!你的第一个例子效果很好。如果我希望输出为整数怎么办?我可以在输出中应用类似 int(round(xy)) 的东西吗?我也一定会考虑你的其他想法!
-
这可能有效,但这里的一般原则是避免使用循环和
apply,您应该能够使用对整个 df 进行操作的矢量化方法对 df 执行操作,但我们没有不知道,因为你还没有发布你的完整代码 -
好的,我已经发布了我的 def()。有任何想法吗?很抱歉最近有这么多问题,但我对 Pandas 很陌生,这个模块似乎很复杂
标签: python python-2.7 csv pandas