假设我具有以下数据框df1
:
a b c d
10 15 20 25
8 18 28 38
20 25 30 35
为简单起见,假设我有一个数据集df2
:
y
1
2
3
我想从df2
中的值中逐行减去df1
中的值
因此,我的最终数据集df3
= df1
-df2
将是:
a b c d
9 14 19 24
6 16 26 36
17 22 27 32
答案 0 :(得分:4)
也许有一些更简单的方法,但是您可以使用apply
df1.apply(lambda x: x - df2['y'])
# a b c d
#0 9 14 19 24
#1 6 16 26 36
#2 17 22 27 32
apply
将在df1中的所有列上循环并减去df2['y']
答案 1 :(得分:4)
将sub
和axis=0
用于矢量化解决方案
df.sub(df2.values, axis=0)
a b c d
0 9 14 19 24
1 6 16 26 36
2 17 22 27 32
Timings
对于少数列:
%timeit (df.sub(df2.values, axis=0))
784 µs ± 15.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df.apply(lambda x: x - df2['y'])
2.22 ms ± 70.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
答案 2 :(得分:3)
另一种方法是使用numpy broadcasting
广播df2
的一维数组,使其与df1
的形状兼容:
注意:图片不能代表正确的形状或值,但这是出于创意的考虑
source
vals = df1.to_numpy() - df2.to_numpy()
df3 = pd.DataFrame(vals, columns=df1.columns)
a b c d
0 9 14 19 24
1 6 16 26 36
2 17 22 27 32
时间
%%timeit
vals = df1.to_numpy() - df2.to_numpy()
pd.DataFrame(vals, columns=df1.columns)
77.7 µs ± 2.15 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit
df1.sub(df2.values, axis=0)
646 µs ± 16.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
df1.apply(lambda x: x - df2['y'])
1.39 ms ± 12.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)