首页 > 解决方案 > Pandas 从 dataframe_b 的所有列中减去 dataframe_a 中的每一列,并将结果写入第三个数据帧

问题描述

我有 dataframe_a 和 dataframe_b 填充了可变数量的列但相同的行数。

我需要从所有 dfa 列中减去 dfb 的每一列,并创建一个包含减去值的新数据框。

现在我正在手动执行此操作:

sub1 = dfa.subtract(dfb[0], axis = 0)
sub2 = dfa.subtract(dfb[1], axis = 0)
sub3 = dfa.subtract(dfb[2], axis = 0)
etc

然后我使用 concat 函数连接所有列:

subbed = pd.concat([sub1, sub2, sub3],axis=1,ignore_index=True)
subbed = pd.concat([dfa, subbed),axis = 1)

这一切似乎都非常低效,让我对编程感到很糟糕,哈哈。您将如何做到这一点而不必手动减去每一列并将结果直接写入新的数据帧?

标签: pythonpandasdataframe

解决方案


设置

import pandas as pd
import numpy as np
from itertools import product

dfa = pd.DataFrame([[8, 7, 6]], range(5), [*'ABC'])
dfb = pd.DataFrame([[1, 2, 3, 4]], range(5), [*'DEFG'])

熊猫concat

我使用rsub带有axis=0参数的运算符方法。 有关更多信息,请参阅此问答

pd.concat({c: dfb.rsub(s, axis=0) for c, s in dfa.items()}, axis=1)

   A           B           C         
   D  E  F  G  D  E  F  G  D  E  F  G
0  7  6  5  4  6  5  4  3  5  4  3  2
1  7  6  5  4  6  5  4  3  5  4  3  2
2  7  6  5  4  6  5  4  3  5  4  3  2
3  7  6  5  4  6  5  4  3  5  4  3  2
4  7  6  5  4  6  5  4  3  5  4  3  2

Numpy的广播

你可以玩弄它并了解它是如何工作的

a = dfa.to_numpy()
b = dfb.to_numpy()
c = a[..., None] - b[:, None]

df = pd.DataFrame(dict(zip(
    product(dfa, dfb),
    c.reshape(5, -1).transpose()
)))

df

   A           B           C         
   D  E  F  G  D  E  F  G  D  E  F  G
0  7  6  5  4  6  5  4  3  5  4  3  2
1  7  6  5  4  6  5  4  3  5  4  3  2
2  7  6  5  4  6  5  4  3  5  4  3  2
3  7  6  5  4  6  5  4  3  5  4  3  2
4  7  6  5  4  6  5  4  3  5  4  3  2

推荐阅读