python - 根据索引“月”和列将 DataFrame 值映射到另一个 DataFrame
问题描述
我有两个数据框。df_A 使用月末值进行索引,df_B 每天进行索引,但有一个月末列供参考。我要提取的值的 [column] 需要通过 df_B['ref'] “查找”并根据每个 df 中的 ['month'] 进行匹配。
数据帧:df_A
月 | 可乐 | colB | 科尔C | 寒冷的 | 油菜 |
---|---|---|---|---|---|
2000-01-31 | 值 | 值 | 值 | 值 | 值 |
2000-02-29 | 值 | 值 | 值 | 值 | 值 |
2000-03-31 | 值 | 值 | 值 | 值 | 值 |
数据框 df_B
日期 | 月 | 参考 | 结果 |
---|---|---|---|
2000-01-01 | 2000-01-31 | 可乐 | 来自 df_A 的值 |
2000-01-02 | 2000-01-31 | 寒冷的 | 来自 df_A 的值 |
2000-01-03 | 2000-01-31 | colB | 来自 df_A 的值 |
2000-01-04 | 2000-01-31 | 科尔C | 来自 df_A 的值 |
实现 df_B['result'] 的 Pythonic 方式是什么?是否有一个列表理解或 lambdas 解决方案可以做到这一点,而无需求助于大规模的、计算密集型的 for/if/loop。
PS我问是因为我目前已经进入了几个嵌套的for循环,因为现实生活中的首要问题有点复杂。堆叠额外的循环让我的大脑受伤......
解决方案
您的df_A
数据需要从宽格式转换为长格式,您可以在这里有效地做到这一点pd.melt
融化的数据看起来像这样:
month ref value
0 2000-01-31 colA val
1 2000-02-29 colA val
2 2000-03-31 colA val
3 2000-01-31 colB val
您可以在其中看到列名被合并为一列,这样就可以轻松地与其他数据框连接。
df_B.merge(df_A.melt(id_vars='month', var_name='ref'), on=['month','ref'] )
输出
date month ref result value
0 2000-01-01 2000-01-31 colA val from df_A val
1 2000-01-02 2000-01-31 colD val from df_A val
2 2000-01-03 2000-01-31 colB val from df_A val
3 2000-01-04 2000-01-31 colC val from df_A val
推荐阅读
- java - 进度条可见性消失导致进度条没有出现在第一位
- android - 如何在使用 Google 地图时获得通知?
- awk - awk:为什么匹配函数打印匹配的行而不提及打印它
- java - 2 Quartz 作业同时更新数据库中的相同值导致不一致的行为
- java - 如何从自定义 LinkedList 类继承?
- r - 插入符号的训练函数中的 PCA 预处理参数
- kdb - 统一列表漂亮打印机
- google-bigquery - BigQuery 无效的字段名称 _PARTITIONDATE 或 _PARTITIONTIME
- postgresql - 在 postgresql 中不使用 typeorm 的 typescript 之间的日期时间
- javascript - 在页面加载时显示全屏 gif,并在 gif 完成后关闭它