Pandas:更快地将字符串元组列表转换为数据帧?

2024-04-29 10:18:41 发布

您现在位置:Python中文网/ 问答频道 /正文

在一个文本字段中,我有以下输入系列,其中包含地理坐标元组作为字符串:

import pandas as pd

coords = pd.Series([
   '(29.65271977700047, -82.33086252299967)',
   '(29.652914019000434, -82.42682220199964)',
   '(29.65301114200048, -82.36455186899968)',
   '(29.642610841000476, -82.29853169599966)',
])

我想解析这些元组中的数字,最后得到以下结果数据帧:

^{pr2}$

这就是我想到的:

str_coords = coords.str[1:-1].str.split(', ')
latlon = str_coords.apply(pd.Series).astype(float)
latlon.columns = ['lat', 'lon']

我的问题:对.apply(pd.Series)的调用在真正的列表中使用“forever”,它有大约120万个条目。有没有更快的方法?在


Tags: 数据字符串文本importpandasas数字coords
2条回答

访问列表的第一个和第二个元素的另一种方法也是通过str

In [174]: coords = pd.Series([
   .....:    '(29.65271977700047, -82.33086252299967)',
   .....:    '(29.652914019000434, -82.42682220199964)',
   .....:    '(29.65301114200048, -82.36455186899968)',
   .....:    '(29.642610841000476, -82.29853169599966)'])

In [175]: str_coords = coords.str[1:-1].str.split(', ')

In [176]: coords_df = pd.DataFrame({'lat': str_coords.str[0], 'lon': str_coords.str[1]})

In [177]: coords_df.astype(float).head()
Out[177]:
         lat        lon
0  29.652720 -82.330863
1  29.652914 -82.426822
2  29.653011 -82.364552
3  29.642611 -82.298532
4  29.652720 -82.330863

一些计时表明,我的解决方案和@ajcr的解决方案都比apply快得多(pd系列)方法(两者之间的差异可以忽略不计):

^{pr2}$

另一种方法是使用矢量化字符串方法^{}

>>> coords.str.extract(r'\((?P<lat>[\-\d\.]+),\s+(?P<lon>[\-\d\.]+)\)')
                  lat                 lon
0   29.65271977700047  -82.33086252299967
1  29.652914019000434  -82.42682220199964
2   29.65301114200048  -82.36455186899968
3  29.642610841000476  -82.29853169599966

您可以将命名的regex捕获组传递给extract-它将创建一个以组名作为列名的数据帧。在

然后可以将此数据帧df转换为float数据类型:

^{pr2}$

相关问题 更多 >