首页 > 解决方案 > 根据索引“月”和列将 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循环,因为现实生活中的首要问题有点复杂。堆叠额外的循环让我的大脑受伤......

标签: pythonpandasdataframeindexing

解决方案


您的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

推荐阅读