我有一个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
参数。