【问题标题】:updating multiple columns in the pandas data frame based another table基于另一个表更新熊猫数据框中的多个列
【发布时间】:2025-12-07 17:10:01
【问题描述】:

我有 2 个这样的 CSV 文件,想通过匹配两个数据帧中的列(test,cond)来更新基于 df2(LL,UL)的 df1 列(LL,UL)
df1 :

test Cond day  mode LL UL  
a    T1   Tue  7  
b    T2   mon  7  
c    T2   sun  6  
d    T3   fri  3  
c    T2   sat  6  
d    T3   wed  3  

df2:-

test Cond LL   UL  
a    T1   15   23  
b    T2   -3   -3.5  
c    T2   -19  -11  
d    T3   6.5  14.5  

我的预期输出应该是:-

def SpecsLL(cond1,test1):
if ((cond1==spec['Cond'] ) & (test1==spec['test'])):
    return df2['LL']
df1['LL'] = df1.apply(lambda x: SpecsLL(x['Cond'],x['test']),axis=1)

我已经尝试了上面的代码,但没有工作。
关于如何做到这一点的任何想法??

【问题讨论】:

标签: python pandas dataframe data-science


【解决方案1】:

简单地使用 pandas 的合并功能

df1.merge(df2)

【讨论】:

    【解决方案2】:

    方法一:combine_first

    index_cols = ['test', 'Cond']
    (
        df1
        .set_index(index_cols)
        .combine_first(
            df2.set_index(index_cols)
        ).reset_index()
    )
    

    解释:

    • set_index 将指定列移动到索引中,表示每一行都应由其testCond 列标识。
    • foo.combine_first(bar) 将识别 foobar 之间的匹配索引 + 列标签,并在 foo 为 NaN 或缺少列/行的地方填充来自 bar 的值。在这种情况下,由于set_index,两个数据帧将在testCond 相同的地方匹配它们的行,然后将填充来自df2ULLL 值到输出的相应列。
    • reset_index 只是反转了 set_index 调用,因此 testCond 再次成为常规列。

    请注意,此操作可能会破坏列的顺序,因此如果这对您很重要,那么您可以在最后调用 .reindex(df1.columns, axis=1),这会将列重新排序为 df1 中的原始顺序。

    方法二:merge

    您也可以使用merge 方法,该方法允许您直接对列进行操作,而无需使用set_index,但需要进行一些其他预处理:

    index_cols = ['test', 'Cond']
    (
        df1
        .drop(['LL', 'UL'], axis=1)
        .merge(
           df2,
           on=index_cols
        )
    )
    

    .drop 调用是必要的,否则 merge 将在输出中包含来自两个 DataFrame 的 ULLL 列:

      test Cond  day  mode  LL_x  UL_x  LL_y  UL_y
    0    a   T1  Tue     7   NaN   NaN  15.0  23.0
    1    b   T2  mon     7   NaN   NaN  -3.0  -3.5
    2    c   T2  sun     6   NaN   NaN -19.0 -11.0
    3    c   T2  sat     6   NaN   NaN -19.0 -11.0
    4    d   T3  fri     3   NaN   NaN   6.5  14.5
    5    d   T3  wed     3   NaN   NaN   6.5  14.5
    

    使用哪个?

    根据您提供的数据,merge 似乎是更自然的操作 - 如果您从不期望 UL 和 LL 在df1 中有任何数据,那么如果可能的话,我会建议从输入 CSV 中完全删除这些列标题,以便 df1 根本没有这些列。在这种情况下,将不再需要 drop 调用,并且所需的 merge 调用非常具有表现力。

    但是,如果您预计 df1 有时会有 ULLL 的实际值,并且您希望在输出中包含这些值,那么 combine_first 解决方案就是您想要的。请注意,如果df1df2 对特定行/列都有不同的非空值,那么df1.combine_first(df2) 将从df1 中选择值并忽略df2 值。如果您想优先考虑来自df2 的值,那么您想反过来调用它,即df2.combine_first(df1)

    【讨论】:

    • 我无法复制您的输出,我使用了相同的代码
    • 在两种解决方案之上,没有给出预期的输出
    • @jagank 你能发布一个代码 sn-p 来准确显示你是如何构建输入的
    • 想出了如何根据另一个表更新一个表,我通过比较列来使用循环,谢谢
    最近更新 更多