Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
忽略索引的两个数据帧的快速减法(Python)_Python_Performance_Pandas_Dataframe - Fatal编程技术网

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

忽略索引的两个数据帧的快速减法(Python),python,performance,pandas,dataframe,Python,Performance,Pandas,Dataframe,如何以尽可能快的方式减去忽略索引的2个数据帧 例如,我想减去: d1= x1 0 -3.141593 0 -3.141593 0 -3.141593 1 -2.443461 1 -2.443461 从 我所尝试的: 我可以这样做,例如: dsub = d1.reset_index(drop=True) - d2.reset_index(drop=True) 但是,我想以最有效的方式进行减法运算。我一直在寻找答案,但我只看到了不考虑速度的解决方案 我如何做到这一点 编辑根据一些答

如何以尽可能快的方式减去忽略索引的2个数据帧

例如,我想减去:

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

我所尝试的:

我可以这样做,例如:

dsub = d1.reset_index(drop=True) - d2.reset_index(drop=True)
但是,我想以最有效的方式进行减法运算。我一直在寻找答案,但我只看到了不考虑速度的解决方案

我如何做到这一点


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

对于较小的数据帧:

方法1(a和b):

方法2:

d1 - d2.values
~784.79 usec/pass
方法3:

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

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

您可以这样做:

d1 - d2.values
或:

演示:

更大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

已经有了一种内置的数据帧减法。看一看

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

dsub = df1['x1'].reset_index(drop=True).sub(df2['x2'].reset_index(drop=True))
如果数据帧具有相同的列标题,则不需要指定列,例如

dsub = df1.reset_index(drop=True).sub(df2.reset_index(drop=True))

试试这个:
d1-d2.values
@MaxU不会返回numpy.array吗?如果这是所需的输出,则必须将其转换回数据帧。编辑:错过了你的编辑,nvm@是的,谢谢你!我已经更正了我的评论,并在我的回答中添加了一个演示。我想知道如果两个数据帧中都有多个列,这将如何工作?我用于
columns
参数的
['x1-x2']
非常随意。关闭它,或将其设置为
d1.columns
。哇,感谢为超大帧添加的时间测试。。。有趣。这是我们能做的最快的吗?:)@denvar你能分享一下为什么一个操作需要4毫秒的输入是一个问题吗?@Jeff good question:),当然可以:我是围绕一个Monte Carlo例程展开的,这个例程最终可能需要数百万个步骤。4毫秒加起来。您可以简单地使用numpy或numba,从而完全避免构建开销。数据帧也用于我程序的其他部分。我的理解是,数据帧处理数据的速度非常快。但也许您是对的,对于这个特定的应用程序,转换为numpy阵列的前期成本是值得的。好建议。
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
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
dsub = pd.DataFrame(d1.values - d2.values, d1.index, ['x1-x2'])

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