【问题标题】:Pandas merge handling duplicates in join outputPandas 合并处理连接输出中的重复项
【发布时间】:2018-11-11 00:36:13
【问题描述】:

在 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

所以现在我希望输出与我的左侧数据帧大小相同,并且当右侧数据帧中有多个匹配项时,我只想带一个随机列。

有没有使用 pandas 捷径技巧的好方法?

谢谢!

【问题讨论】:

    标签: python pandas dataframe random merge


    【解决方案1】:

    您可以在合并之前将rightdrop_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 列),这与随机选择一行相同。

    【讨论】:

    • 我明白了,所以你删除了合并键列的重复项。巧妙!谢谢
    • @YohanRoth - 在这种情况下 - 如果你的输出的第一行是1 1 1 2.0 2.0,我认为保证最后一行也是1 3 2 2.0 2.0,因为你已经放弃了1 2 3。根据您要求random 选择的问题,我有点担心这可能不是您想要的行为。也许这很好,但值得确保它与您想要的一致。
    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多