如何基于同用户同品类的revenue行参考值填充DataFrame的segment列?
解决方案
首先得处理amount列的格式——因为带$符号没法直接做数值比较,先把它转成数值类型:
df['amount'] = df['amount'].str.replace('$', '').astype(float)
接下来先给business为revenue的行计算segment,cost行暂时设为缺失值:
import numpy as np import pandas as pd df['segment'] = np.where( df['business'] == 'revenue', np.where( (df['amount'] < 15) & (df['goods_type'] == 'used'), 'low', 'high' ), np.nan )
最后按user和goods_type分组,把每组里的缺失值(也就是cost行)用同组的revenue行的segment值填充:
df['segment'] = df.groupby(['user', 'goods_type'])['segment'].transform(lambda x: x.ffill().bfill())
测试示例数据后,输出会和你期望的完全一致:
user amount goods_type business segment 0 1 10.0 used cost low 1 1 30.0 used revenue low 2 1 15.0 new cost high 3 1 50.0 new revenue high
如果觉得分组变换的逻辑不够直观,也可以用合并的方式实现:
# 提取revenue行计算segment,只保留匹配需要的字段 revenue_seg = df[df['business'] == 'revenue'].assign( segment = np.where( (df['amount'] < 15) & (df['goods_type'] == 'used'), 'low', 'high' ) )[['user', 'goods_type', 'segment']] # 将计算好的segment合并回原表,cost行自动匹配对应值 df = df.merge(revenue_seg, on=['user', 'goods_type'], how='left')
这种方法逻辑更清晰,适合数据量较大的场景,能避免分组变换的额外开销。
内容的提问来源于stack exchange,提问作者titutubs
相关产品推荐
相关产品推荐

