为了账号安全,请及时绑定邮箱和手机立即绑定

列中重复值之间的条件

列中重复值之间的条件

紫衣仙女 2021-12-17 16:59:46
当每个客户有多个计划时,他们都会被复制。我想为客户设置状态:如果他们填写了所有带有“canceled_at”的产品,则客户状态被取消,但是当不是每个带有“canceled_at”的产品,但至少有一个产品时,状态是“降级”,因为他丢失了一个产品。customer|canceled_at|statusx       |3/27/2018  |x       |           |y       |2/2/2018   |y       |2/2/2018   |z       |1/1/2018   |a       |           |      我已经有取消状态,现在我只需要降级df['status']=(df.groupby('customer')['canceled_at'].  transform(lambda x: x.notna().all()).map({True:'canceled'})).fillna(df.status)customer|canceled_at|statusx       |3/27/2018  |downgradex       |           |downgradey       |2/2/2018   |canceledy       |2/2/2018   |canceledz       |1/1/2018   |canceleda       |           |      
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

下面是没有缺失值和由分组可能比较柱Series customer与GroupBy.transform和GroupBy.all, GroupBy.any对于测试的所有值TrueS(所有非丢失)或至少一个值不缺失(任何非丢失),并将它传递到numpy.select:


g = df['canceled_at'].notna().groupby(df['customer'])

m1 = g.transform('all')

m2 = g.transform('any')


df['status'] = np.select([m1, m2],['canceled','downgrade'], np.nan)

print (df)

  customer canceled_at     status

0        x   3/27/2018  downgrade

1        x         NaN  downgrade

2        y    2/2/2018   canceled

3        y    2/2/2018   canceled

4        z    1/1/2018   canceled

5        a         NaN        nan

或者:


df['status'] = np.select([m1, m2],['canceled','downgrade'], '')

print (df)

  customer canceled_at     status

0        x   3/27/2018  downgrade

1        x         NaN  downgrade

2        y    2/2/2018   canceled

3        y    2/2/2018   canceled

4        z    1/1/2018   canceled

5        a         NaN         

如果只有NaNs 组需要转换为downgrade:


mask = df['canceled_at'].notna().groupby(df['customer']).transform('all')

df['status'] = np.where(mask,'canceled','downgrade')

print (df)

  customer canceled_at     status

0        x   3/27/2018  downgrade

1        x         NaN  downgrade

2        y    2/2/2018   canceled

3        y    2/2/2018   canceled

4        z    1/1/2018   canceled

5        a         NaN  downgrade  


查看完整回答
反对 回复 2021-12-17
?
长风秋雁

TA贡献1757条经验 获得超7个赞

这是一种方法:


import pandas as pd


def select_status(canceled):

    c = canceled.count()

    if c == 0:

        status = ''

    elif c == len(canceled):

        status = 'canceled'

    else:

        status = 'downgrade'

    return pd.Series(status, index=canceled.index)


df = pd.DataFrame({'customer': ['x', 'x', 'y', 'y', 'z', 'a'],

                   'canceled_at': ['3/27/2018', None, '2/2/2018', '2/2/2018', '1/1/2018', None]})

df['status'] = df.groupby('customer')['canceled_at'].apply(select_status)

print(df)

输出:


  customer canceled_at     status

0        x   3/27/2018  downgrade

1        x        None  downgrade

2        y    2/2/2018   canceled

3        y    2/2/2018   canceled

4        z    1/1/2018   canceled

5        a        None


查看完整回答
反对 回复 2021-12-17
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号