如何比较熊猫数据框中的行子集

时间:2019-01-29 14:23:04

标签: python pandas

我有一个巨大的熊猫数据框,看起来像这样:

id        type        price         min           max

1          ch           10          10            100
1          fo           8           20            100
1          dr           7           10            90
1          ad           5           16            20
1          dr           6           10            90
1          fo           4           20            100
2          ch           5           40            50
2          fo           3           10            50
2          ch           3           40            50
...        ...          ...         ...           ... 

我想添加一个新列“匹配”以获取如下内容:

id         type         price       min           max     match

1          ch           10          10            100     false
1          fo           8           20            100     false
1          dr           7           10            90      false
1          ad           5           16            20      false
1          dr           6           10            90      true
1          fo           4           20            100     true
2          ch           5           40            50      false
2          fo           3           10            50      false
2          ch           3           40            50      true
...        ...          ...         ...           ...     ...

我尝试使用shift:

 df['match']=np.where((df['id'] == df['id'].shift()) & (df['type'] == df['type'].shift()) & (df['min'] == df['min'].shift()) & (df['max'] == df['max'].shift()),true, false)

但这只是将当前行与上一行进行比较,没有特定的模式来确定符合条件的前一行的数量。我想选择id作为比较行的窗口。有办法吗?

任何建议都会受到赞赏。

谢谢

1 个答案:

答案 0 :(得分:3)

您可以使用duplicated指定列的subset来考虑:

df.assign(match=df.duplicated(subset=['id', 'type', 'min', 'max']))

   id type  price  min  max  match
0   1   ch     10   10  100  False
1   1   fo      8   20  100  False
2   1   dr      7   10   90  False
3   1   ad      5   16   20  False
4   1   dr      6   10   90   True
5   1   fo      4   20  100   True
6   2   ch      5   40   50  False
7   2   fo      3   10   50  False
8   2   ch      3   40   50   True