Pandas 初学者代码优化指南

1． 在用索引的DataFrame行上的Crude looping

2． 用iterrows()循环

3． 用 apply()循环

4． Pandas Series矢量化

5． NumPy数组矢量化

importnumpyasnp

# Define a basic Haversine distance formula

defhaversine(lat1,lon1,lat2,lon2):

MILES=3959

dlat=lat2-lat1

dlon=lon2-lon1

a=np.sin(dlat/2)**2+np.cos(lat1)*np.cos(lat2)*np.sin(dlon/2)**2

c=2*np.arcsin(np.sqrt(a))

total_miles=MILES*c

returntotal_miles

Pandas中的Crude looping，或者你永远不应该这么做

# Define a function to manually loop over all rows and return a series of distances

defhaversine_looping(df):

distance_list=[]

foriinrange(,len(df)):

d=haversine(40.671,-73.985,df.iloc[i]['latitude'],df.iloc[i]['longitude'])

distance_list.append(d)

returndistance_list

%%timeit

# Run the haversine looping function

df['distance']=haversine_looping(df)

645 ms ± 31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit

# Haversine applied on rows via iteration

haversine_series=[]

forindex,rowindf.iterrows():

haversine_series.append(haversine(40.671,-73.985,row['latitude'],row['longitude']))

df['distance']=haversine_series

166 ms ± 2.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit

# Timing apply on the Haversine function

df['distance']=df.apply(lambdarow:haversine(40.671,-73.985,row['latitude'],row['longitude']),axis=1)

90.6 ms ± 7.55 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

iterrows()方法用apply()方法替代后，大致可以将函数的运行时间减半。为了更深入地了解函数中的实际运行时间，可以运行一个在线分析器工具（Jupyter中神奇的命令%lprun）

# Haversine applied on rows with line profiler

%lprun-fhaversinedf.apply(lambdarow:haversine(40.671,-73.985,row['latitude'],row['longitude']),axis=1)

Pandas Series矢量化

Pandas包含一个总体的矢量化函数集合，从数学运算到聚合和字符串函数（可用函数的扩展列表，查看Pandas docs）。对Pandas Series和DataFrame的操作进行内置优化。结果，使用矢量Pandas函数几乎总是会用自定义的循环实现类似的功能。

%%timeit

# Vectorized implementation of Haversine applied on Pandas series

df['distance']=haversine(40.671,-73.985,df['latitude'],df['longitude'])

1.62 ms ± 41.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Pandas series矢量化可以完成日常计算优化的绝大多数需要。然而，如果速度是最高优先级，那么可以以NumPy Python库的形式调用援军。

NumPy库，将自己描述为一个“Python科学计算的基本包”，在后台执行优化操作，预编译C语言代码。跟Pandas一样，NumPy操作数组对象（简称ndarrays）；然而，它省去了Pandas series操作所带来的大量资源开销，如索引、数据类型检查等。因此，NumPy数组的操作可以明显快于pandas series的操作。

%%timeit

# Vectorized implementation of Haversine applied on NumPy arrays

df['distance']=haversine(40.671,-73.985,df['latitude'].values,df['longitude'].values)

370 µs ± 18 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

NumPy数组操作运行取得了又一个四倍的改善。总之，通过looping改进了运行时间超过半秒，通过NumPy矢量化，运行时间改进到了三分之一毫秒级！

NumPy数组矢量化操作比Pandas series更有效。

• 发表于:
• 原文链接http://kuaibao.qq.com/s/20171211B0Q84J00?refer=cp_1026
• 腾讯「云+社区」是腾讯内容开放平台帐号（企鹅号）传播渠道之一，根据《腾讯内容开放平台服务协议》转载发布内容。
• 如有侵权，请联系 yunjia_community@tencent.com 删除。

2021-06-23

2021-06-23

2021-06-23

2021-06-23

2018-06-26

2018-06-01

2018-04-11

2018-03-27

2021-06-23

2021-06-23