我有一个程序需要将一列的值添加到多个其他列中,我很惊讶地发现,在一个循环中逐列地执行所有列的计算要慢得多与熊猫。
我希望有些东西可以告诉我做我需要做的最快的方法,并解释为什么第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
答案 0 :(得分:1)
11将以安全的方式重建列,允许多个dtype赋值。
10 仅适用于单个dtype(就像你在这里一样);需要注意的是this
10比11更快的原因是11使数据的副本工作然后交换回来; 11直接替换现场值。
对于你正在做的事情,它的概率确定。