我将一个简单的函数应用于熊猫的df。下面是我正在尝试的。即使我试图修改函数以执行一步操作,我仍然会得到相同的错误。任何方向都会非常有用。
def udf_pd(df_group):
if (df_group['A'] - df_group['B']) > 1:
df_group['D'] = 'Condition-1'
elif df_group.A == df_group.C:
df_group['D'] = 'Condition-2'
else:
df_group['D'] = 'Condition-3'
return df_group
final_df = df.groupby(['id1','id2']).apply(udf_pd)
final_df = final_df.reset_index()
ValueError: The truth value of a Series is ambiguous. Use a.empty,
a.bool(), a.item(), a.any() or a.all().发布于 2019-07-22 19:14:58
请注意,在groupby.apply中,该函数应用于整个组的。另一方面,每个if条件必须归结为一个单个值(而不是任何True/False值系列)。
因此,该函数中的2列的每一次比较都必须得到例如all()或any()的补充,如下例所示:
def udf_pd(df_group):
if (df_group.A - df_group.B > 1).all():
df_group['D'] = 'Condition-1'
elif (df_group.A == df_group.C).all():
df_group['D'] = 'Condition-2'
else:
df_group['D'] = 'Condition-3'
return df_group当然,函数可以返回整个组,例如,由一个新列进行“扩展”,在这种情况下,新列的单个值是广播,因此当前组中的每一行都接收这个值。
我创建了一个测试DataFrame:
id1 id2 A B C
0 1 1 5 3 0
1 1 1 7 5 4
2 1 2 3 4 3
3 1 2 4 5 4
4 2 1 2 4 3
5 2 1 4 5 4 在本例中:
因此,df.groupby(['id1','id2']).apply(udf_pd)的结果是:
id1 id2 A B C D
0 1 1 5 3 0 Condition-1
1 1 1 7 5 4 Condition-1
2 1 2 3 4 3 Condition-2
3 1 2 4 5 4 Condition-2
4 2 1 2 4 3 Condition-3
5 2 1 4 5 4 Condition-3发布于 2019-07-22 18:45:33
我以前遇到过这个错误,我的理解是熊猫不确定它应该对哪个值运行条件。您可能希望使用.any()或.all()。考虑下面的例子
>>> a = pd.Series([0,0,3])
>>> b = pd.Series([1,1,1])
>>> a - b
0 -1
1 -1
2 2
dtype: int64
>>> (a - b) >= 1
0 False
1 False
2 True
dtype: bool你可以看到( are ) >= 1的真实性有点矛盾,向量中的第一个元素是假的,而其他元素是真的。
使用.any()或.all()将评估整个系列。
>>> ((a - b) >= 1).any()
True
>>> ((a - b) >= 1).all()
False.any()检查该系列中的任何元素是否为True。而.all()则检查元素的是否全部为。在这个例子中他们不是。
您还可以查看此帖子以获得更多信息:Pandas Boolean .any() .all()
https://stackoverflow.com/questions/57151732
复制相似问题