You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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列向下移位一行,每个分组的第一行会得到NaN
  • df['seller'] == ...:将移位后的买家列与当前行卖家列比较,得到布尔值(转售为True,否则为False)
  • .astype(int):将布尔值转换为0/1的整数标记,符合需求的格式

内容的提问来源于stack exchange,提问作者Quant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:55:32