为pandas中的给定索引添加单列数据到其他列的最快方法?

时间:2014-02-06 14:59:09

标签: python pandas

我有一个程序需要将一列的值添加到多个其他列中,我很惊讶地发现,在一个循环中逐列地执行所有列的计算要慢得多与熊猫。

我希望有些东西可以告诉我做我需要做的最快的方法,并解释为什么第10行的时间比第11行快得多。

由于

In [2]: import pandas as pd

In [3]: import numpy as np

In [4]: df_1 = pd.DataFrame(abs(np.random.randn(10000000, 4)), columns=['a','b','c', 'd'])

In [5]: sample_ind = range(1, 100)

In [6]: copy_columns = ['a', 'b']

In [7]: df_1.head()
Out[7]: 
          a         b         c         d
0  1.147683  1.008620  0.287466  0.766438
1  1.123729  0.373583  0.298866  1.187121
2  1.773574  0.120433  0.363052  0.269104
3  1.717708  0.330670  1.015575  1.390325
4  0.841748  0.181788  0.219881  0.267149

In [8]: df_1['new'] = df_1['c'] + df_1['d']

In [9]: df_1.head()
Out[9]: 
          a         b         c         d       new
0  1.147683  1.008620  0.287466  0.766438  1.053904
1  1.123729  0.373583  0.298866  1.187121  1.485988
2  1.773574  0.120433  0.363052  0.269104  0.632157
3  1.717708  0.330670  1.015575  1.390325  2.405900
4  0.841748  0.181788  0.219881  0.267149  0.487030

In [10]: %timeit -n 100 for col in copy_columns: df_1[col][sample_ind] = df_1['new'][sample_ind] + df_1[col][sample_ind]
100 loops, best of 3: 907 µs per loop

In [11]: %timeit -n 100 df_1.loc[sample_ind, copy_columns] = df_1.loc[sample_ind, 'new'] + df_1.loc[sample_ind, copy_columns]
100 loops, best of 3: 1.12 s per loop

所以我要做的是将列'd'值添加到列'a'和'b'以获取给定的一组id。在这个例子中,我为所有数据做了。

id  a   b   c   d
2   1   2   4   1
3   1   2   3   2
3   1   2   2   2
4   1   2   1   4



id  a   b   c   d
2   2   3   4   1
3   3   4   3   2
3   3   4   2   2
4   5   6   1   4

1 个答案:

答案 0 :(得分:1)

11将以安全的方式重建列,允许多个dtype赋值。

10 仅适用于单个dtype(就像你在这里一样);需要注意的是this

10比11更快的原因是11使数据的副本工作然后交换回来; 11直接替换现场值。

对于你正在做的事情,它的概率确定。