用df2中一列的值减去df1中所有列的值

时间:2019-10-22 22:27:22

标签: python pandas

假设我具有以下数据框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

3 个答案:

答案 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)

subaxis=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的形状兼容:

enter image description here

注意:图片不能代表正确的形状或值,但这是出于创意的考虑
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)