首页 > 解决方案 > 如何比较熊猫数据框中的行子集

问题描述

我有一个巨大的熊猫数据框,如下所示:

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
...        ...          ...         ...           ...     ...

我尝试使用移位:

 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 作为窗口来比较行。有没有办法做到这一点?

任何建议都受到高度赞赏。

谢谢

标签: pythonpandas

解决方案


您可以使用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

推荐阅读