【问题标题】:Subtracting multiple columns between dataframes based on key根据键在数据帧之间减去多列
【发布时间】:2021-10-04 12:37:50
【问题描述】:

我有两个数据框,例如:

Df1 -

A   B   C   D
x   j   5   2
y   k   7   3
z   l   9   4
Df2 -

A   B   C   D
z   o   1   1
x   p   2   1
y   q   3   1

我想根据 A 列中包含的键,从 Df1 中的 C 和 D 列中减去 Df2 中的 C 和 D 列。

我还想确保 B 列保持不变,例如:

Df3 -

A   B   C   D
x   j   3   1
y   k   4   2
z   l   8   3

我在以下帖子中找到了一个几乎完美的答案: Subtracting columns based on key column in pandas dataframe

但是答案没有解释的是主df中是否有其他列(例如B列)不应该作为索引或操作参与。

有人能给点建议吗?

我最初是在执行一个循环,在另一个 df 中找到值并将其扣除,但是这需要很长时间才能让我的代码以我正在处理的数据大小运行。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    想法是指定用于加工的列和用于减法的列,将所有非cols 列名转换为MultiIndex,减法:

    match = ['A']
    cols = ['C','D']
    df1 = Df1.set_index(match + Df1.columns.difference(match + cols).tolist())
    
    df = df1.sub(Df2.set_index(match)[cols], level=0).reset_index()
    print (df)
       A  B  C  D
    0  x  j  3  1
    1  y  k  4  2
    2  z  l  8  3
    

    或者将不匹配的值替换为原来的Df1

    match = ['A']
    cols = ['C','D']
    df1 = Df1.set_index(match)
    
    df = df1.sub(Df2.set_index(match)[cols], level=0).reset_index().fillna(Df1)
    print (df)
       A  B  C  D
    0  x  j  3  1
    1  y  k  4  2
    2  z  l  8  3
    

    【讨论】:

    • 嘿 - 谢谢你的回答。应用起来有点困难,因为上面是一个示例,实际上 B 列代表 6 - 8 列......有没有一种方法不涉及先将每一列显式设置为索引?
    • @SlowlyLearning - 是否可以指定减法列?
    • 对不起,我不确定我明白了吗?
    • @SlowlyLearning - 答案已编辑。
    • 太棒了,这行得通。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2018-11-12
    相关资源
    最近更新 更多