Python 熊猫快速繁殖技术

Python 熊猫快速繁殖技术,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个来自max mind.的数据库,它从IP向我提供位置信息。我编写了以下函数从ip检索城市和国家:- import geoip2.database def country(ipa): with geoip2.database.Reader('/home/jupyter/GeoIP2-City.mmdb') as reader: try: response = reader.city(ipa) response = re

我有一个来自max mind.的数据库,它从IP向我提供位置信息。我编写了以下函数从ip检索城市和国家:-

import geoip2.database
def country(ipa):
    with geoip2.database.Reader('/home/jupyter/GeoIP2-City.mmdb') as reader:
        try:
            response = reader.city(ipa)
            response = response.country.iso_code
            return response
        except:
            return 'NA'
        
def city(ipa):
    with geoip2.database.Reader('/home/jupyter/GeoIP2-City.mmdb') as reader:
        try:
            response = reader.city(ipa)
            response = response.city.name
            return response
        except:
            return 'NA'
我每分钟都在处理这个问题,并将其应用到熊猫中的列
raddr
:-

df['country']=df['raddr'].apply(country)
df['city']=df['raddr'].apply(city)
问题是每次迭代都要花3分钟以上的时间来执行,我得到了大约150000行,并且我正在每个行上应用这个函数

我想在一分钟内完成这个操作。
任何建议。

您的功能未优化。想象一下,应用函数时必须读取每一行的数据库。甚至maxmind的github也特别指出,创建reader对象的成本很高:

>>> # This creates a Reader object. You should use the same object
>>> # across multiple requests as creation of it is expensive.
您应该做的是向函数传递一个额外的关键字参数:

def国家/地区(ipa,读卡器):
尝试:
响应=读卡器。城市(ipa)
响应=响应.country.iso_代码
返回响应
除:
返回“NA”
def城市(ipa,读卡器):
尝试:
响应=读卡器。城市(ipa)
response=response.city.name
返回响应
除:
返回“NA”
然后使用额外的关键字参数调用apply函数:

使用geoip2.database.Reader('/home/jupyter/geoip2 City.mmdb')作为读卡器:
df['country']=df['raddr']。应用(国家,读卡器=读卡器)
df['city']=df['raddr']。应用(城市,读卡器=读卡器)

您的功能未优化。想象一下,应用函数时必须读取每一行的数据库。甚至maxmind的github也特别指出,创建reader对象的成本很高:

>>> # This creates a Reader object. You should use the same object
>>> # across multiple requests as creation of it is expensive.
您应该做的是向函数传递一个额外的关键字参数:

def国家/地区(ipa,读卡器):
尝试:
响应=读卡器。城市(ipa)
响应=响应.country.iso_代码
返回响应
除:
返回“NA”
def城市(ipa,读卡器):
尝试:
响应=读卡器。城市(ipa)
response=response.city.name
返回响应
除:
返回“NA”
然后使用额外的关键字参数调用apply函数:

使用geoip2.database.Reader('/home/jupyter/geoip2 City.mmdb')作为读卡器:
df['country']=df['raddr']。应用(国家,读卡器=读卡器)
df['city']=df['raddr']。应用(城市,读卡器=读卡器)

一方面,不要每次调用函数
city
country
时都试图读取数据库一方面,不要每次调用函数
city
country
时都试图读取数据库它将处理过程减少了一半,但仍然,你知道什么可以让它更快吗?我想在30秒内完成,因为我必须每分钟运行一次脚本。你可能应该看看它,它将处理过程减少了一半,但仍然,我想在30秒内完成它,因为我必须每分钟运行一次脚本。你可能应该看看