首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个新的列,如果-然后在分组熊猫df

创建一个新的列,如果-然后在分组熊猫df
EN

Stack Overflow用户
提问于 2019-07-22 18:21:48
回答 2查看 80关注 0票数 1

我将一个简单的函数应用于熊猫的df。下面是我正在尝试的。即使我试图修改函数以执行一步操作,我仍然会得到相同的错误。任何方向都会非常有用。

代码语言:javascript
复制
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().
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-22 19:14:58

请注意,在groupby.apply中,该函数应用于整个组的。另一方面,每个if条件必须归结为一个单个值(而不是任何True/False值系列)。

因此,该函数中的2列的每一次比较都必须得到例如all()或any()的补充,如下例所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
   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    

在本例中:

  • 在第一组(id1 == 1,id2 == 1)中,在所有行中,all > 1,所以条件-1为True。
  • 在第二组(id1 == 1,id2 == 2)中,上述条件是不满足,但在所有行中,A == C,所以条件-2是True。
  • 在最后一组(id1 == 2,id2 == 1)中,上述两种条件都不满足,所以条件-3是真。

因此,df.groupby(['id1','id2']).apply(udf_pd)的结果是:

代码语言:javascript
复制
   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
票数 2
EN

Stack Overflow用户

发布于 2019-07-22 18:45:33

我以前遇到过这个错误,我的理解是熊猫不确定它应该对哪个值运行条件。您可能希望使用.any().all()。考虑下面的例子

代码语言:javascript
复制
>>> 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()将评估整个系列。

代码语言:javascript
复制
>>> ((a - b) >= 1).any()
True
>>> ((a - b) >= 1).all()
False

.any()检查该系列中的任何元素是否为True。而.all()则检查元素的是否全部为。在这个例子中他们不是。

您还可以查看此帖子以获得更多信息:Pandas Boolean .any() .all()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57151732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档