python - Pandas 合并处理连接输出中的重复项
问题描述
有没有一种只带一行的好方法,最好是在 Pandas 的左连接期间随机进行一对多匹配?
例如
left = [[1,1,1], [2,2,2],[3,3,3], [9,9,9], [1,3,2]]
right = [[1,2,2],[1,2,3],[3,2,2], [3,2,9], [3,2,2]]
left = np.asarray(left)
right = np.asarray(right)
left = pd.DataFrame(left)
right = pd.DataFrame(right)
joined_left = left.merge(right, how="left", left_on=[0], right_on=[0])
所以这就是我们得到的
0 1 2
0 1 1 1
1 2 2 2
2 3 3 3
3 9 9 9
4 1 3 2
0 1 2
0 1 2 2
1 1 2 3
2 3 2 2
3 3 2 9
4 3 2 2
0 1_x 2_x 1_y 2_y
0 1 1 1 2.0 2.0
1 1 1 1 2.0 3.0
2 2 2 2 NaN NaN
3 3 3 3 2.0 2.0
4 3 3 3 2.0 9.0
5 3 3 3 2.0 2.0
6 9 9 9 NaN NaN
7 1 3 2 2.0 2.0
8 1 3 2 2.0 3.0
所以现在我想让输出与我的左数据帧大小相同,当右数据帧中有多个匹配项时,我只想带一个随机列。
有没有使用熊猫捷径技巧的好方法?
谢谢你!
解决方案
您可以在合并之前随机播放right
和。drop_duplicates(...[, keep='first'])
right2 = right.sample(frac=1).drop_duplicates(subset=[0])
left.merge(right2, how='left', left_on=[0], right_on=[0])
0 1_x 2_x 1_y 2_y
0 1 1 1 2.0 2.0
1 2 2 2 NaN NaN
2 3 3 3 2.0 2.0
3 9 9 9 NaN NaN
4 1 3 2 2.0 2.0
我们先洗牌right
,然后删除除第一行以外的所有重复项(仅考虑第 0 列),这与随机选择一行相同。
推荐阅读
- spring - 禁用某些作业的自动装配
- algorithm - 如何根据变量将 1 个集合平衡到多个其他集合?
- java - 为什么我无法将以下字符串作为输入并将其添加到 ArrayList?
- asp.net - 无法将日期转换为正确的格式
- android - Android 双向数据绑定 Float 到 EditText
- javascript - 异步函数不等待
- database - 将 ?input 映射作为 Datomic 查询参数传递
- python - 使用python的Windows多显示器设置脚本
- ilog - 一个决策表中的输入值应在另一个决策表中显示为下拉列表
- python - 从一个文件中读取多个 json