我有 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)
这一切似乎都非常低效,让我觉得编程很糟糕,哈哈。如果不必手动减去每一列并将结果直接写入新的数据帧,您将如何做到这一点?
答案 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=0
。 See 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
你可以玩玩它并了解它是如何工作的
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