如何在Pandas DataFrame中识别买家转售商品的交易?
解决Pandas标记商品转售交易问题
问题背景
现有包含prod_id(商品唯一ID)、seller(卖家)、buyer(买家)的交易DataFrame,需要标记买家后续转售该商品的交易:同一prod_id分组下,当前行的seller等于前一行的buyer时标记为1(转售),否则为0。
原代码错误原因
你尝试的代码无法运行,是因为df.groupby('prod_id')['seller']返回的是GroupBy对象,并非可直接比较的Series数据。必须先对分组后的buyer列执行shift(1)操作,生成对应每个分组的移位Series,再与原seller列进行比较。
高效解决方案
采用分组内移位后直接比较的方式,代码简洁且性能高效:
import pandas as pd # 构造示例数据集 data = { 'prod_id': ['cc_123', 'cc_111', 'cc_025', 'cc_806', 'cc_963', 'cc_235', 'cc_806', 'cc_555', 'cc_444'], 'seller': ['x', 'd', 'y', 'd', 'a', 'o', 'm', 'z', 's'], 'buyer': ['y', 'y', 'x', 'm', 'b', 'h', 't', 'w', 'q'] } df = pd.DataFrame(data) # 标记转售交易 df['resale'] = (df['seller'] == df.groupby('prod_id')['buyer'].shift(1)).astype(int) print(df)
运行结果
prod_id seller buyer resale 0 cc_123 x y 0 1 cc_111 d y 0 2 cc_025 y x 0 3 cc_806 d m 0 4 cc_963 a b 0 5 cc_235 o h 0 6 cc_806 m t 1 7 cc_555 z w 0 8 cc_444 s q 0
代码逻辑说明
df.groupby('prod_id')['buyer'].shift(1):在每个商品ID分组内,将buyer列向下移位一行,每个分组的第一行会得到NaNdf['seller'] == ...:将移位后的买家列与当前行卖家列比较,得到布尔值(转售为True,否则为False).astype(int):将布尔值转换为0/1的整数标记,符合需求的格式
内容的提问来源于stack exchange,提问作者Quant
相关产品推荐
相关产品推荐

