比较DataFrame的两列中的前几行



我有一个交易数据框架,其中包含产品、卖家和买家的唯一ID。我想记录是否有人购买了产品,然后转售。以下是我的数据集的简化视图:

prod_id seller buyer
0       cc_123      x     y
1       cc_111      d     y
2       cc_025      y     x
3       cc_806      d     m
4       cc_963      a     b
5       cc_235      o     h
6       cc_806      m     t
7       cc_555      z     w
8       cc_444      s     q

我最初的想法是按id分组,并通过检查当前行的卖方是否与给定产品的前一行的买方是同一个人来比较分组数据帧中的连续行,例如,交易6是转售,因为同一个人";m〃;以前购买,现在销售产品cc_806:

prod_id seller buyer
3       cc_806      d     m
6       cc_806      m     t

所以最终的数据集看起来是这样的:

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

其中1表示是/真,0表示否/假。我的尝试不起作用:

df['resale'] = df.groupby('prod_id')['seller'] == df.groupby('prod_id')['buyer'].shift(1)

有有效的解决方案吗?

您的尝试几乎成功了。对于卖家来说,它不需要groupby

df['resale'] = df.groupby('prod_id')['buyer'].shift(1) == df['seller']
df['resale'] = df['resale'].astype(int)
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["resale"]=df.apply(lambda x: len(df[(df["prod_id"]==x["prod_id"])& (df["buyer"]==x["seller"])]),axis=1)

输出

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

最新更新