首页 > 解决方案 > 熊猫中的“放大设置”行为

问题描述

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

df1是按日期索引的数据框。 df2是另一个按日期索引的数据框,但df1只有df2一个共同日期,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?

我正在使用熊猫版本 1.2.5

标签: pythonpandas

解决方案


放大设置是__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 被重新索引为 match df1

在此特定示例中,join产生完全相同的结果:

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

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

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


推荐阅读