python - 比较两个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
解决方案
可以使用类似的.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
也在.df1
df2
结果:
ID Shape count
2 3 Square 2
3 4 Rectangle 2
4 5 Square 2
5 6 Rectangle 1
6 7 Square 1
推荐阅读
- java - java.lang.UnsupportedOperationException(无法将arraylist添加到列表中)
- javascript - 简单的乘法计算器不保留十进制值
- python - Python 多处理库 Pool.map()
- java - JaVers - 如何在 JSON 中添加额外字段以引用实体
- sql - Oracle SQL:行间的间隙
- java - 如何在android java中显示图像集?
- c# - 如何从 SQL 查询中获取消息到 C# 中的富文本框中
- java - java中月份两个日期之间的差异
- javascript - 将区块链块存储在数组中不是效率低下吗?(Node.js)
- c++ - Implementing/replacement of volatile std::string