gpt4 book ai didi

python - 加速数据框 .loc()

转载 作者:太空宇宙 更新时间:2023-11-04 05:13:56 25 4
gpt4 key购买 nike

我有一个大约 400k IP 的列表(存储在 pandas DataFrame df_IP 中)使用 maxming geoIP 数据库进行地理定位。我使用城市版本,并检索城市、纬度、经度和县代码(法国省),因为有些城市具有相同的名称但位于非常不同的地方。

这是我的工作代码:

import geoip2.database
import pandas as pd

reader = geoip2.database.Reader('path/to/GeoLite2-City.mmdb')
results = pd.DataFrame(columns=('IP',
'city',
'latitude',
'longitude',
'dept_code'))

for i, IP in enumerate(df_IP["IP"]):
try :
response = reader.city(IP)
results.loc[i] = [IP,response.city.name,response.location.latitude,response.location.longitude,response.subdivisions.most_specific.iso_code]
except Exception as e:
print ("error with line {}, IP {}: {}").format(i,df_IP["IP"][i],e )

它运行良好,但在每个循环中变得越来越慢。如果我在第 1000 个 IP 上计时,我需要 4.7 秒,所以整个 400k 应该需要大约 30 分钟,但它运行了将近 4 个小时。

IMO 唯一会随着时间变慢的是数据帧 results 的填充:我有哪些不使用 .loc 并且可以更快的替代方案?最后我仍然需要相同的数据框。

我也有兴趣解释为什么 loc 在大型数据帧上如此缓慢。

最佳答案

我遇到过类似的情况,因为 loc 导致运行时崩溃。摆弄了很多之后,我找到了一个 super 快的简单解决方案。使用 set_value 而不是 loc。

这是示例代码的样子:您可以针对您的用例对其进行调整。假设你的数据框是这样的

Index  'A'  'B' 'Label'
23 0 1 Y
45 3 2 N

self.data.set_value(45,'Label,'NA')

这会将第二行的“标签”列的值设置为 NA。

有关 set_value 的更多信息,请访问以下链接:

http://pandas.pydata.org/pandas-docs/version/0.17/generated/pandas.DataFrame.set_value.html

关于python - 加速数据框 .loc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42274253/

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