【问题标题】:Pandas join vs add column熊猫加入与添加列
【发布时间】:2018-02-05 12:21:19
【问题描述】:

我有 2 个数据帧(df1df2)具有相同的 MultiIndexdf1 有 A 列,df2 有 B 列。

我发现了 2 种“加入”这些数据框的方法:

df_joined = df1.join(df2, how='inner')

df1['B'] = df2['B']

第一个选项需要更长的时间。为什么? 选项 2 是否不查看索引而只是将列“附加”到右侧?

之后运行返回True,所以最终结果看起来是一样的,但这可能是因为df1df2中的索引也是相同的顺序:

df_joined.equals(df1)

在知道索引相同的情况下,有没有更快的方法来加入数据帧?

【问题讨论】:

    标签: python pandas join


    【解决方案1】:

    如果索引对齐,没有比df1['B'] = df2['B'] 更快的方法了。

    将一个系列分配给另一个系列已经在pandas 中得到了很好的优化。

    join 需要比赋值更长的时间,因为它明确地将 df1.indexdf2.index 对齐,这很昂贵。不假定索引的顺序一致。根据pd.DataFrame.join documentation,如果没有指定列,join 将在数据帧的相应索引上发生。

    如果您发现这是您工作流程中的瓶颈,我会感到惊讶。如果是,那么我建议您直接使用 numpy 数组并完全避免使用 pandas

    【讨论】:

    • OP 并没有抱怨df1['B'] = df2['B'] 的执行速度,而是好奇为什么join 方法的执行时间比赋值要长?
    • @Szabolcs 添加了一个简短的解释。
    • @jp_data_analysis 那么如果 df2 中的索引处于不同的顺序(即未对齐)会发生什么?在df1['B'] = df2['B'] 中,仍会添加该列,但它本质上是错误的,即错误索引处的值?
    • @Dimebag, pandas 将相应地排列系列,例如df2 中的索引 0 将被分配给 df1 中的索引 0,即使当您 print 数据帧时它们处于不同的序号位置。我不知道在你的情况下是索引还是序数位置。
    • 简短回答,使用的逻辑完全不同。 df1.join(df2) 做的更多,而且总是更慢,即使输出相同。您可以查看pandas源代码了解更多详情。
    猜你喜欢
    • 2014-09-21
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2023-01-26
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多