首页 > 解决方案 > 比较两个df并删除唯一值

问题描述

我有两个 df,其中一个我只想保留最新数据,即 df1 充当滚动记录,df2 向它提供信息。

如果 df1 中出现的 ID 没有出现在 df2 中,我想将其从 df1 的新迭代中删除。应添加出现在 df2 中的所有新 ID,并保留重复项。

此外,我对 ID 的出现次数进行了统计。

我一直在尝试使用 df.join,我认为外部方法是合适的。

理想情况下,我想要与 df.drop_duplicates 相反的东西

到目前为止,这是我的代码:

grp1 = {'ID': ['1','2','3','4','5'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square']
        }

grp2 = {'ID': ['3','4','5','6','7'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square']
        }

df1 = pd.DataFrame(grp1, columns= ['ID','Shape'])
df2 = pd.DataFrame(grp2, columns= ['ID','Shape'])

df1.loc[df1["ID"].isin(df2["ID"]), 'count'] += 1 

df1 = pd.concat([df1, df2]).drop_duplicates('ID').reset_index(drop=True)


到目前为止我写的代码是这样的,但是它给了我错误的输出

df1 = pd.merge(df1,df2,on='ID',how='right')

output:

    ID  Shape_x  count_x    Shape_y count_y
0   3   Square    1.0      Rectangle    1
1   4   Rectangle 1.0      Rectangle    1
2   5   Square    1.0       Square      1
3   6   NaN       NaN      Rectangle    1
4   7   NaN       NaN       Square      1

我想要达到的目标:


df1
    ID  Shape        count
0    1  Rectangle      1
1    2  Rectangle      1
2    3     Square      1
3    4  Rectangle      1
4    5     Square      1

df2
    ID  Shape        count
0    3  Rectangle      1
1    4  Rectangle      1
2    5     Square      1
3    6  Rectangle      1
4    7     Square      1

ideal output:
    ID  Shape        count
0    3  Rectangle      2
1    4  Rectangle      2
2    5     Square      2
3    6  Rectangle      1
4    7     Square      1

标签: pythonpandasdataframe

解决方案


可以使用类似的.isin()代码df2,如下:

df2.loc[df2["ID"].isin(df1["ID"]), 'count'] += 1 

数据设置

grp1 = {'ID': ['1','2','3','4','5'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square']
        }

grp2 = {'ID': ['3','4','5','6','7'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square']
        }

df1 = pd.DataFrame(grp1, columns= ['ID','Shape'])
df2 = pd.DataFrame(grp2, columns= ['ID','Shape'])

df1['count'] = 1
df2['count'] = 1

print(df1)

  ID      Shape  count
0  1  Rectangle      1
1  2  Rectangle      1
2  3     Square      1
3  4  Rectangle      1
4  5     Square      1


print(df2)

  ID      Shape  count
0  3  Rectangle      1
1  4  Rectangle      1
2  5     Square      1
3  6  Rectangle      1
4  7     Square      1

然后,运行新代码:

df2.loc[df2["ID"].isin(df1["ID"]), 'count'] += 1 

结果:

print(df2)

  ID      Shape  count
0  3  Rectangle      2
1  4  Rectangle      2
2  5     Square      2
3  6  Rectangle      1
4  7     Square      1

编辑

如果你想从 接近df1,你可以使用:

grp1 = {'ID': ['1','2','3','4','5'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square']
        }

grp2 = {'ID': ['3','4','5','6','7'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square']
        }

df1 = pd.DataFrame(grp1, columns= ['ID','Shape'])
df2 = pd.DataFrame(grp2, columns= ['ID','Shape'])

df1['count'] = 1
df2['count'] = 1

df1.loc[df1["ID"].isin(df2["ID"]), 'count'] += 1 

df1 = pd.concat([df1, df2]).drop_duplicates('ID').reset_index(drop=True)

这个产量df1,如下:

print(df1)

  ID      Shape  count
0  1  Rectangle      1
1  2  Rectangle      1
2  3     Square      2
3  4  Rectangle      2
4  5     Square      2
5  6  Rectangle      1
6  7     Square      1

然后,过滤掉其中的行

出现在 df1 中但未出现在 df2 中的 ID

我们再次使用我们得心应手的朋友.isin()

df1.loc[df1['ID'].isin(df2['ID'])]

这个过滤器只保留那些ID也在.df1df2

结果:

  ID      Shape  count
2  3     Square      2
3  4  Rectangle      2
4  5     Square      2
5  6  Rectangle      1
6  7     Square      1

推荐阅读