Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在dataframe中应用自定义函数_Python_Pandas - Fatal编程技术网

Python 在dataframe中应用自定义函数

Python 在dataframe中应用自定义函数,python,pandas,Python,Pandas,我有一个数据帧:df_input1有10M行。其中一个列名是“地理定位”。对于所有记录,我必须从地理位置中找到州名称,并填写另一个数据帧的“州”列:df_final。为此,我创建了一个函数convert_to_state,如下所示: df_final['State'] = df_input1['geolocations'].apply(convert_to_state) 有没有更快的方法来实现这一点,因为这需要很多时间 样本数据:df_输入1 vehicle-no start

我有一个数据帧:df_input1有10M行。其中一个列名是“地理定位”。对于所有记录,我必须从地理位置中找到州名称,并填写另一个数据帧的“州”列:df_final。为此,我创建了一个函数convert_to_state,如下所示:

 df_final['State']  = df_input1['geolocations'].apply(convert_to_state)
有没有更快的方法来实现这一点,因为这需要很多时间

样本数据:df_输入1

vehicle-no start                end                   geolocations
123        10/12/2019 09:00:12  10/12/2019 11:00:78   fghdrf3245@bafd
456        12/10/2019 06:09:12  10/10/2019 09:23:12   {098ddc76yhfbdb7877]
自定义函数:

将反向地理编码器作为rg导入
导入多段线
def将_转换为_状态(geoloc):
long_lat=多段线。解码(geoloc)[0]
state_name=rg.search(long_lat)[0][“admin1”]
返回状态名称

由于子例程本质上是纯功能性的(每一行的处理不受另一行的影响),我们可以利用多线程使其运行更快

您可以使用以下命令

Command Prompt : pip install swifter

import swifter
df_final['State']  = df_input1['geolocations'].swifter.apply(convert_to_state)

我建议使用numpy来创建一个向量化函数

将numpy导入为np
作为pd进口熊猫
作为rg导入反向地球编码器
导入多段线
def将_转换为_状态(geoloc):
long_lat=多段线。解码(geoloc)[0]
state_name=rg.search(long_lat)[0][“admin1”]
返回状态名称
convert_to_state=np.向量化(convert_to_state)#将方法向量化
col=df_input1['geologications'].值#列的numpy数组
df_最终['State']=pd.系列(将_转换为_状态(col))
在numpy阵列上运行的矢量化函数将大大提高性能,然后将其转换回pandas系列

我强烈建议对该方法和正常的
进行计时。在ipython中使用
%timeit
decorator应用
方法,并报告较小子集上的运行时

这里有一个非常愚蠢的例子
您可能会看到,在这种情况下,速度基本上翻了一番。

您能否提供1)示例数据2)转换为状态功能。优化将取决于您正在执行的操作类型。您还可以探索达斯克和swifter@AnantGupta我已经用示例数据集和自定义函数编辑了这个问题。
In [1]: import pandas as pd                               

In [2]: import numpy as np                                

In [3]: x = pd.DataFrame( 
   ...:     [ 
   ...:         [1,2,"Some.Text"], 
   ...:         [3,4,"More.Text"] 
   ...:     ], 
   ...:     columns = ["A","B", "C"] 
   ...: )                                                 

In [4]: x                                                 
Out[4]: 
   A  B          C
0  1  2  Some.Text
1  3  4  More.Text

In [5]: def foo_split(t): 
   ...:     return t.split(".")[0] 
   ...:                                                   

In [6]: %timeit y = x.C.apply(foo_split)                  
248 µs ± 4.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [7]: c = x.C.values # numpy array of the column        

In [8]: foo_split_vect = np.vectorize(foo_split)          

In [9]: %timeit z = pd.Series(foo_split_vect(c))          
159 µs ± 624 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)