【问题标题】:Mapping DataFrame values to another DataFrame based on index 'month' and column根据索引“月”和列将 DataFrame 值映射到另一个 DataFrame
【发布时间】:2021-10-30 02:50:00
【问题描述】:

我有两个 DataFrame。 df_A 使用月末值进行索引,df_B 每天进行索引,但有一个月末列供参考。我要提取的值的 [column] 需要通过 df_B['ref'] “查找”并根据每个 df 中的 ['month'] 进行匹配。

数据帧:df_A

month colA colB colC colD colE
2000-01-31 val val val val val
2000-02-29 val val val val val
2000-03-31 val val val val val

DataFrame df_B

date month ref result
2000-01-01 2000-01-31 colA val from df_A
2000-01-02 2000-01-31 colD val from df_A
2000-01-03 2000-01-31 colB val from df_A
2000-01-04 2000-01-31 colC val from df_A

实现 df_B['result'] 的 Pythonic 方式是什么?是否有一个列表理解或 lambdas 解决方案可以做到这一点,而无需求助于大量计算密集型的 for/if/loop。

附:我问是因为我目前已经进入了几个嵌套的 for 循环,因为现实生活中的首要问题有点复杂。堆叠额外的循环让我的大脑受伤......

【问题讨论】:

    标签: python pandas dataframe indexing


    【解决方案1】:

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

    【讨论】:

    • 谢谢。 pd.melt 和 merge 绝对是去这里的正确方法。为什么我没有想到 pd.melt !!! ;) 对于最终找到此线程的任何人,我会注意,还有一些额外的事情需要记住。 a) 不能为 id_vars 传入 df.index,只能是熔体中列的名称引用;否则你会得到一个 KeyError。 b) 在本例中保留 df_B 的原始索引很好,这是通过在合并命令末尾添加 .set_index(df_B.index) 来实现的。
    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多