如果在熊猫数据框中其他功能[重复]
Posted
技术标签:
【中文标题】如果在熊猫数据框中其他功能[重复]【英文标题】:if else function in pandas dataframe [duplicate] 【发布时间】:2017-09-09 12:52:02 【问题描述】:我正在尝试在数据帧上应用 if 条件,但我遗漏了一些东西(错误:系列的真值不明确。使用 a.empty、a.bool()、a.item() , a.any() 或 a.all()。)
raw_data = 'age1': [23,45,21],'age2': [10,20,50]
df = pd.DataFrame(raw_data, columns = ['age1','age2'])
def my_fun (var1,var2,var3):
if (df[var1]-df[var2])>0 :
df[var3]=df[var1]-df[var2]
else:
df[var3]=0
print(df[var3])
my_fun('age1','age2','diff')
【问题讨论】:
错误意味着,在您选择的列中有一些值,它们被评估为 True,还有一些值被评估为 False。您可能需要每行运行 my_fun。 我不知道每行的这种方法,你能给我任何提示吗? 查看@jezrael 的答案,这是更好的解决方案 【参考方案1】:你可以使用numpy.where
:
def my_fun (var1,var2,var3):
df[var3]= np.where((df[var1]-df[var2])>0, df[var1]-df[var2], 0)
return df
df1 = my_fun('age1','age2','diff')
print (df1)
age1 age2 diff
0 23 10 13
1 45 20 25
2 21 50 0
错误最好解释here。
使用apply
的较慢解决方案,其中需要axis=1
用于按行处理数据:
def my_fun(x, var1, var2, var3):
print (x)
if (x[var1]-x[var2])>0 :
x[var3]=x[var1]-x[var2]
else:
x[var3]=0
return x
print (df.apply(lambda x: my_fun(x, 'age1', 'age2','diff'), axis=1))
age1 age2 diff
0 23 10 13
1 45 20 25
2 21 50 0
也可以使用loc
,但有时数据会被覆盖:
def my_fun(x, var1, var2, var3):
print (x)
mask = (x[var1]-x[var2])>0
x.loc[mask, var3] = x[var1]-x[var2]
x.loc[~mask, var3] = 0
return x
print (my_fun(df, 'age1', 'age2','diff'))
age1 age2 diff
0 23 10 13.0
1 45 20 25.0
2 21 50 0.0
【讨论】:
关键是,在现实生活中,条件更加棘手,似乎与 np.where 嵌套可能有点难以阅读。使用更传统的 if-elif-else 语句是否有任何改变? 我使用apply
添加解决方案。你是对的,如果意味着有许多 elif 的复杂条件,apply 会更好。
谢谢,既然你问了更多细节,我打开了另一个话题,只是为了避免在这个 3d 中混淆。 ***.com/questions/43393672/…
@progster 也可以随意投票给这个答案。以及您认为有用的任何其他答案。【参考方案2】:
您可以使用pandas.Series.where
df.assign(age3=(df.age1 - df.age2).where(df.age1 > df.age2, 0))
age1 age2 age3
0 23 10 13
1 45 20 25
2 21 50 0
你可以把它包装在一个函数中
def my_fun(v1, v2):
return v1.sub(v2).where(v1 > v2, 0)
df.assign(age3=my_fun(df.age1, df.age2))
age1 age2 age3
0 23 10 13
1 45 20 25
2 21 50 0
【讨论】:
【参考方案3】:没有np.where
或pd.Series.where
还有另一种方法。我并不是说它更好,但是在尝试使这个解决方案适应今天一个具有挑战性的问题之后,发现where
的语法并不那么直观。最后,不确定在哪里是否有可能,但发现以下方法可以让您在修改子集之前查看它,并且它对我来说更快地导致了解决方案。当然也适用于这里的 OP。
您故意在数据帧的切片上设置值,因为 Pandas 经常警告您不要这样做。
This 答案向您展示了正确的方法。
下面给你一个片段:
df.loc[df['age1'] - df['age2'] > 0]
..看起来像:
age1 age2
0 23 10
1 45 20
在原始数据框中为修改切片后要保留的值添加额外的列:
df['diff'] = 0
现在修改切片:
df.loc[df['age1'] - df['age2'] > 0, 'diff'] = df['age1'] - df['age2']
..结果:
age1 age2 diff
0 23 10 13
1 45 20 25
2 21 50 0
【讨论】:
以上是关于如果在熊猫数据框中其他功能[重复]的主要内容,如果未能解决你的问题,请参考以下文章