gpt4 book ai didi

python - Pandas :如何更快地应用于数据框?

转载 作者:太空狗 更新时间:2023-10-29 17:59:12 24 4
gpt4 key购买 nike

考虑这个 pandas 示例,我通过将 ABfloat 相乘来计算列 C如果使用带有 lambda 函数的 apply 满足特定条件:

import pandas as pd
df = pd.DataFrame({'A':[1,2,3,4,5,6,7,8,9],'B':[9,8,7,6,5,4,3,2,1]})

df['C'] = df.apply(lambda x: x.A if x.B > 5 else 0.1*x.A*x.B, axis=1)

预期的结果是:

   A  B    C
0 1 9 1.0
1 2 8 2.0
2 3 7 3.0
3 4 6 4.0
4 5 5 2.5
5 6 4 2.4
6 7 3 2.1
7 8 2 1.6
8 9 1 0.9

问题是这段代码很慢,我需要在大约 5600 万行的数据帧上执行此操作。

上述 lambda 操作的 %timeit-result 是:

1000 loops, best of 3: 1.63 ms per loop

从计算时间以及在我的大型数据帧上执行此操作时的内存使用情况来看,我认为此操作在进行计算时使用了中间系列。

我尝试用不同的方式来制定它,包括使用临时列,但我想出的每一个替代解决方案都更慢。

有没有办法以不同且更快的方式获得我需要的结果,例如通过使用 numpy?

最佳答案

为了提高性能,您最好使用 NumPy 数组并使用 np.where -

a = df.values # Assuming you have two columns A and B
df['C'] = np.where(a[:,1]>5,a[:,0],0.1*a[:,0]*a[:,1])

运行时测试

def numpy_based(df):
a = df.values # Assuming you have two columns A and B
df['C'] = np.where(a[:,1]>5,a[:,0],0.1*a[:,0]*a[:,1])

时间 -

In [271]: df = pd.DataFrame(np.random.randint(0,9,(10000,2)),columns=[['A','B']])

In [272]: %timeit numpy_based(df)
1000 loops, best of 3: 380 µs per loop

In [273]: df = pd.DataFrame(np.random.randint(0,9,(10000,2)),columns=[['A','B']])

In [274]: %timeit df['C'] = df.A.where(df.B.gt(5), df[['A', 'B']].prod(1).mul(.1))
100 loops, best of 3: 3.39 ms per loop

In [275]: df = pd.DataFrame(np.random.randint(0,9,(10000,2)),columns=[['A','B']])

In [276]: %timeit df['C'] = np.where(df['B'] > 5, df['A'], 0.1 * df['A'] * df['B'])
1000 loops, best of 3: 1.12 ms per loop

In [277]: df = pd.DataFrame(np.random.randint(0,9,(10000,2)),columns=[['A','B']])

In [278]: %timeit df['C'] = np.where(df.B > 5, df.A, df.A.mul(df.B).mul(.1))
1000 loops, best of 3: 1.19 ms per loop

仔细观察

让我们仔细看看 NumPy 的数字运算能力,并与 pandas 进行比较 -

# Extract out as array (its a view, so not really expensive
# .. as compared to the later computations themselves)

In [291]: a = df.values

In [296]: %timeit df.values
10000 loops, best of 3: 107 µs per loop

案例 #1:使用 NumPy 数组并使用 numpy.where:

In [292]: %timeit np.where(a[:,1]>5,a[:,0],0.1*a[:,0]*a[:,1])
10000 loops, best of 3: 86.5 µs per loop

同样,分配到新列中:df['C'] 也不会很昂贵 -

In [300]: %timeit df['C'] = np.where(a[:,1]>5,a[:,0],0.1*a[:,0]*a[:,1])
1000 loops, best of 3: 323 µs per loop

案例 #2:使用 pandas 数据框并使用其 .where 方法(无 NumPy)

In [293]: %timeit df.A.where(df.B.gt(5), df[['A', 'B']].prod(1).mul(.1))
100 loops, best of 3: 3.4 ms per loop

案例 #3:使用 pandas 数据框(无 NumPy 数组),但使用 numpy.where -

In [294]: %timeit np.where(df['B'] > 5, df['A'], 0.1 * df['A'] * df['B'])
1000 loops, best of 3: 764 µs per loop

案例 #4:再次使用 pandas 数据框(没有 NumPy 数组),但使用 numpy.where -

In [295]: %timeit np.where(df.B > 5, df.A, df.A.mul(df.B).mul(.1))
1000 loops, best of 3: 830 µs per loop

关于python - Pandas :如何更快地应用于数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41588034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com