当列中的值不相等时,合并两个数据帧中的列



我有一个Pandasdf,它看起来像这样:

|   | yyyy_mm_dd | id | product    | status | is_50 | cnt |
|---|------------|----|------------|--------|-------|-----|
|   | 2002-12-15 | 7  | prod_rs    | 2      | 0     | 8   |
|   | 2002-12-15 | 16 | prod_go    | 2      | 0     | 1   |
|   | 2002-12-15 | 16 | prod_mb    | 2      | 0     | 3   |
|   | 2002-12-15 | 29 | prod_er    | 2      | 0     | 2   |
|   | 2002-12-15 | 29 | prod_lm    | 2      | 0     | 2   |
|   | 2002-12-15 | 29 | prod_ops   | 2      | 0     | 2   |

我还有第二个类似的数据帧:

|   | id | product    | cnt |
|---|----|------------|-----|
|   | 7  | prod_rs    | 8   |
|   | 16 | prod_go    | 1   |
|   | 16 | prod_mb    | 3   |
|   | 29 | prod_er    | 2   |
|   | 29 | prod_lm    | 2   |
|   | 29 | prod_ops   | 6   |

如何创建第三个数据帧,只存储计数不相等的行?基于以上内容,由于id/product组合的cnt不同,将只返回最后一行。示例输出:

|   | id | product | cnt_df1 | cnt_df2 |
|---|----|---------|---------|---------|
|   | 29 | prod_ops| 2       | 6       |

第二df的大小大一行,因此并非所有id/product组合都可以存在于两个数据帧中。

我一直在研究merge,但我不确定当cnt列不相等时如何使用。

您仍然可以使用merge,只需在第二步中检查计数列是否不同

In [40]: df = pd.merge(df1.drop(["yyyy_mm_dd", "", "status", "is_50"], axis=1), df2, on=['id', 'product'], suffixes=['_df1', '_df2'])                                                                              
In [41]: df                                                                                                                                                                                                        
Out[41]: 
id       product cnt_df1      cnt_df2
0   7     prod_rs        8            8   
1   16    prod_go        1            1   
2   16    prod_mb        3            3   
3   29    prod_er        2            2   
4   29    prod_lm        2            2   
5   29    prod_ops       2            6   

现在,您可以简单地筛选出具有相同cnt的所有行,例如使用query()

In [42]: df.query("cnt_df1 != cnt_df2")                                                                                                                                                                            
Out[42]: 
id       product cnt_df1      cnt_df2
5   29    prod_ops       2            6  

您可以通过以下两个步骤实现:

# Merge the DataFrames
df3 = df1.merge(df2, on=["id", "product"])
# Filter for where `cnt` are not equal
df3 = df3[df3["cnt_x"].ne(df3["cnt_y"])]
#    yyyy_mm_dd  id   product  status  is_50  cnt_x  cnt_y
# 5  2002-12-15  29  prod_ops       2      0      2      6

如果不希望使用默认的_x_y,则可以在合并时使用suffixes参数。

最新更新