【问题标题】:Inner and Outer merge in Pandas with indicator=TruePandas 中的内部和外部合并,indicator=True
【发布时间】:2020-03-13 10:52:44
【问题描述】:

假设我有两个数据框df1df2。我可以通过这种方式进行内部和外部连接:

inner_df = df1.merge(df2, how="inner", left_on=col_df1, right_on=col_df2)
outer_df = df1.merge(df2, how="outer", left_on=col_df1, right_on=col_df2)

DataFrame.merge 方法允许您使用indicator 属性:如果为 True,则在输出 DataFrame 中添加一个名为“_merge”的列,其中包含有关每行来源的信息。对于合并键仅出现在“左”数据帧中的观察,该列的值为“left_only”,对于合并键仅出现在“右”数据帧中的观察,该列的值为“right_only”,如果发现观察的合并键,则为“both”两者都有。

我不确定我是否正确理解了这个属性的作用。这是我的问题:这两段代码是否等效?

inner_df = df1.merge(df2, how="inner", left_on=col_df1, right_on=col_df2)
outer_df = df1.merge(df2, how="outer", left_on=col_df1, right_on=col_df2,
                     indicator=True)
inner_df = outer_df[outer_df['_merge'] == 'both'].drop(columns=["_merge"])

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    两次合并返回相同的行。但不完全相同的数据帧。区别在于:

    1. inner_df2 有一个额外的列 _merge 列 - 好的,如果用 ...drop(columns='_merge') 摆脱它是微不足道的
    2. 这些列可能已填充了 NaN 值。如果有些具有整数类型,则它们已转换为浮点类型。这通常不是一个大问题,因为一旦您只选择没有 NaN 值的行,您就可以将它们转换回它们的原始类型。在一个用例中一个严重的问题:如果您有一个 numpy int64 类型和使用超过 53 位的值。在这种情况下,来回转换会将最低有效位归零。这将导致不准确的值,因为它们代表一些度量,或者如果它们是标识符,则更糟。

    长话短说:两者是否等效取决于实际用例...

    【讨论】:

    • 非常感谢,正是我想要的。所以基本上“两者”与内连接相同,“两者”+“左”与左外连接相同,“两者”+“右”与右外连接相同。对吗?
    • @RiccardoBucco:完全一样,有同样的极端情况问题......
    猜你喜欢
    • 2018-01-17
    • 2021-05-31
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2013-05-04
    • 2011-03-10
    • 2010-09-30
    相关资源
    最近更新 更多