列中重复值之间的条件

当每个客户有多个计划时,他们都会被复制。我想为客户设置状态:


如果他们填写了所有带有“canceled_at”的产品,则客户状态被取消,但是当不是每个带有“canceled_at”的产品,但至少有一个产品时,状态是“降级”,因为他丢失了一个产品。


customer|canceled_at|status

x       |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|status

x       |3/27/2018  |downgrade

x       |           |downgrade

y       |2/2/2018   |canceled

y       |2/2/2018   |canceled

z       |1/1/2018   |canceled

a       |           |      


紫衣仙女
浏览 187回答 2
2回答

蛊毒传说

下面是没有缺失值和由分组可能比较柱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     status0        x   3/27/2018  downgrade1        x         NaN  downgrade2        y    2/2/2018   canceled3        y    2/2/2018   canceled4        z    1/1/2018   canceled5        a         NaN        nan或者:df['status'] = np.select([m1, m2],['canceled','downgrade'], '')print (df)  customer canceled_at     status0        x   3/27/2018  downgrade1        x         NaN  downgrade2        y    2/2/2018   canceled3        y    2/2/2018   canceled4        z    1/1/2018   canceled5        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     status0        x   3/27/2018  downgrade1        x         NaN  downgrade2        y    2/2/2018   canceled3        y    2/2/2018   canceled4        z    1/1/2018   canceled5        a         NaN  downgrade  

长风秋雁

这是一种方法:import pandas as pddef 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     status0        x   3/27/2018  downgrade1        x        None  downgrade2        y    2/2/2018   canceled3        y    2/2/2018   canceled4        z    1/1/2018   canceled5        a        None
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python