【问题标题】:"setting with enlargement" behavior in Pandas熊猫中的“放大设置”行为
【发布时间】:2021-09-10 10:40:11
【问题描述】:

你能帮我理解以下内容吗?

df1 是一个按日期索引的数据框。 df2 是另一个同样按日期索引的数据框,但 df1df2 只有一个共同的日期,2018-12-31。 请参阅以下输出:

df1 = pd.DataFrame({'A':[1,2,3]}, index = pd.to_datetime(["2018-12-31","2019-12-31","2020-12-31"]))
df2 = pd.DataFrame({'XX':[700,800]}, index = pd.to_datetime(["2016-12-31","2018-12-31"]))
df1['BB'] = df2['XX']

            A   BB
2018-12-31  1   800.0
2019-12-31  2   NaN
2020-12-31  3   NaN

我意识到这是可行的,即使 df1['BB'] = df2['XX'] 的左侧和右侧的行数不同。

这是更复杂表达式的缩写吗?由于结果保留了 df1 中的所有行,但没有扩展索引以包含 df2 中的行。这个操作像“left merge”(“左连接”)吗?它是否会包含 df1'sdf2's 索引的联合,并适当地填充 NaN?

我使用的是 pandas 1.2.5 版

【问题讨论】:

  • 这在功能上等同于 join: df1.join(df2) 或更确切地说是 df1.join(df2.rename(columns={'XX': 'BB'})) 在这种情况下。然而,它在技术上更等同于reindex,这就是系列的放大方式:df2['XX'].reindex(df1.index).rename('BB')
  • 查看_reindex_for_setitem 发生这种情况的位置。
  • 感谢@HenryEcker 澄清了一切!

标签: python pandas


【解决方案1】:

设置放大是__set_item__ 的一部分,在执行以下操作时会调用它:

df['col'] = someSeries

在这种情况下,函数_set_item 被调用,该函数用于“将系列添加到指定列中的DataFrame。”

由于 DataFrame 被索引,并且其中包含的所有 Series 也以相同的方式索引,因此新 Series 必须匹配它要添加到的 DataFrame 索引。

_sanitize_column 函数确保列兼容。在这种情况下,为了兼容性(索引对齐)需要一个Series.reindex 操作。这发生在_reindex_for_setitem


所以回答问题

“这是更复杂表达式的缩写吗?”

是的,解析的表达式是:

df1['BB'] = df2['XX'].reindex(df1.index)._values

这个操作是不是像“左合并”(“左连接”)?

是的。该操作类似于“左合并”(实际上),因为结果 Series 将包含 df1 中的所有键,因为 Series 被重新索引以匹配 df1

在这个具体的例子中,join 产生 exact 相同的结果:

df1 = df1.join(df2.rename(columns={'XX': 'BB'}))

它是否会包含 df1 和 df2 索引的并集,并适当地填充 NaN?

不,它只会包含要添加到的 DataFrame 中的索引。

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 2013-05-01
    • 2013-08-13
    • 2020-12-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多