首页 > 解决方案 > 比较来自相同熊猫数据框的 2 列的值并根据比较返回第 3 列的值

问题描述

我正在尝试比较同一 pandas 数据框中的 2 列之间的值,并且对于找到匹配项的位置,我想从该行返回值,但从第 3 列返回值。

基本上如果以下是数据框df

| date      | date_new   | category | value  |
| --------- | ---------- | -------- | ------ |
|2016-05-11 | 2018-05-15 | day      | 1000.0 |
|2020-03-28 | 2018-05-11 | night    | 2220.1 |
|2018-05-15 | 2020-03-28 | day      | 142.8  |
|2018-05-11 | 2019-01-29 | night    | 1832.9 |

我想添加一个新列,value_new它基本上是通过value在比较每个日期值的date_new每个日期值之后获取值,date然后比较两行是否具有相同的category值。

[转换步骤]
- 1. 为每个值date_new寻找匹配date
- 2. 如果找到匹配,比较category列中的值是否也匹配- 3. 如果上述步骤中的两个匹配都满足,从列中
选择相应的值value两个匹配项都满足的行,否则留空。

所以,我最终希望最终的数据框看起来像这样。

| date      | date_new   | category | value  | value_new |
| --------- | ---------- | -------- | ------ | --------- |
|2016-05-11 | 2018-05-15 | day      | 1000.0 | 142.8     |
|2020-03-28 | 2018-05-11 | night    | 2220.1 | 1832.9    |
|2018-05-15 | 2020-03-28 | day      | 142.8  | None      |
|2018-05-11 | 2016-05-11 | day      | 1832.9 | 1000.0    |

标签: pythonpandasdataframe

解决方案


DataFrame.merge与左连接和分配的新列一起使用:

df['value_new'] = df.merge(df, 
                           left_on=['date_new','category'], 
                           right_on=['date','category'], how='left')['value_y']
print (df)

         date    date_new category   value  value_new
0  2016-05-11  2018-05-15      day  1000.0      142.8
1  2020-03-28  2018-05-11    night  2220.1        NaN
2  2018-05-15  2020-03-28      day   142.8        NaN
3  2018-05-11  2016-05-11      day  1832.9     1000.0

推荐阅读