忽略索引的两个数据帧的快速减法(Python)

2024-05-08 11:00:44 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在忽略索引的情况下,以最快的方式减去2个数据帧。在

例如,我想减去:

d1=
      x1
0 -3.141593
0 -3.141593
0 -3.141593
1 -2.443461
1 -2.443461

^{pr2}$

我所做的:

我可以这样做,例如:

dsub = d1.reset_index(drop=True) - d2.reset_index(drop=True)

不过,我想用最有效的方法做减法。我一直在寻找答案,但我只看到了不考虑速度的解决方案。在

我该怎么做?在


编辑根据一些答案,在我的机器上运行以下几次:

对于较小的数据帧:

方法1(a和b):

a: d1.reset_index(drop=True) - d2.reset_index(drop=True)
b: d1.reset_index(drop=True).sub(d2.reset_index(drop=True))
~1024.91 usec/pass

方法2:

d1 - d2.values
~784.79 usec/pass

方法三:

pd.DataFrame(d1.values - d2.values, d1.index, ['x1-x2'])
~653.82 usec/pass

对于非常大的数据帧,请参阅下面的@MaxU的答案。在


Tags: 数据方法答案trueindex方式情况pass
3条回答

已经有一个内置的数据帧减法。看看DataFrame.sub。在

您的示例中的用法基本上是:

dsub = df1['x1'].reset_index(drop=True).sub(df2['x2'].reset_index(drop=True))

如果数据帧具有相同的列标题,则不需要指定列,例如

^{pr2}$
dsub = pd.DataFrame(d1.values - d2.values, d1.index, ['x1-x2'])

dsub

enter image description here

你可以这样做:

d1 - d2.values

或者:

^{pr2}$

演示:

In [172]: d1 - d2.values
Out[172]:
         x1
0 -0.698132
0 -1.396264
0 -2.094395
1 -2.094395
1 -2.792527

In [173]: d1.x1 - d2.x2.values
Out[173]:
0   -0.698132
0   -1.396264
0   -2.094395
1   -2.094395
1   -2.792527
Name: x1, dtype: float64

更大DFs的时机:

In [180]: d1 = pd.concat([d1] * 10**5, ignore_index=True)

In [181]: d2 = pd.concat([d2] * 10**5, ignore_index=True)

In [182]: d1.shape
Out[182]: (500000, 1)

In [183]: %timeit pd.DataFrame(d1.values - d2.values, d1.index, ['x1-x2'])
100 loops, best of 3: 4.07 ms per loop

In [184]: %timeit d1 - d2.values
100 loops, best of 3: 3.99 ms per loop

In [185]: d1 = pd.concat([d1] * 10, ignore_index=True)

In [186]: d2 = pd.concat([d2] * 10, ignore_index=True)

In [187]: d1.shape
Out[187]: (5000000, 1)

In [188]: %timeit pd.DataFrame(d1.values - d2.values, d1.index, ['x1-x2'])
10 loops, best of 3: 19.9 ms per loop

In [189]: %timeit d1 - d2.values
100 loops, best of 3: 14 ms per loop

In [190]: %timeit d1.reset_index(drop=True) - d2.reset_index(drop=True)
1 loop, best of 3: 242 ms per loop

In [191]: %timeit d1.reset_index(drop=True).sub(d2.reset_index(drop=True))
1 loop, best of 3: 242 ms per loop

相关问题 更多 >