熊猫从 dataframe_b 的所有列中减去 dataframe_a 中的每一列,并将结果写入第三个数据帧

时间:2021-03-09 16:44:30

标签: python pandas dataframe

我有 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)

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

1 个答案:

答案 0 :(得分:2)

设置

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=0See this Q&A for more information

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
相关问题