python - 熊猫中的“放大设置”行为
问题描述
你能帮我理解以下内容吗?
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's
和df2's
索引的并集,并适当地填充 NaN?
我正在使用熊猫版本 1.2.5
解决方案
放大设置是__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 中的索引。
推荐阅读
- android - 解析单值 JSON 对象
- python - ModelSerializer 不尊重字段的 required 属性
- java - 已建立的连接被 Tomcat 8 上主机中的软件中止
- reactjs - saga 在更新 redux 状态时挂起
- python - 双向 LSTM:准确度从 1% 开始下降到 0.01%
- c# - WPF - DataGrid - 单击其他任何位置时动态添加的控件消失
- docker - Docker挂载顺序乱序,不让我挂载我的目录
- c# - Asp.Net Web Api 任务死锁
- php - 我应该在哪里放置一个新的 sql 查询函数 Symfony 3
- wordpress - 如何在 Woocommerce 订单列表中更改批量操作订单