Python正则分割字符串构建指定结构Pandas DataFrame的方法
最简实现方案
不用写复杂正则,利用Pandas自带的字符串右拆分方法就能搞定,全程只需要4行核心代码,可适配所有带空格的国家名场景。
- 核心思路:所有数据的最后5段都是无空格的数值内容,只有最前面的国家名可能包含空格,因此从字符串最右侧开始按空格拆分5次,就能自动把完整国家名和后续5个数值完全分离,不需要手动编写复杂正则匹配规则。
完整可运行代码如下:
import pandas as pd # 原始嵌套列表数据 raw_data = [['Korea, Republic of 0.07 40 13 13 153'], ['United States 0.22 8 3 4 109'],['Argentina 0.19 10 14 17 33']] # 1. 展平嵌套列表,提取每个子列表内的字符串转为Pandas序列 str_series = pd.Series([item[0] for item in raw_data]) # 2. 从右往左按空格拆分5次,直接展开为6列 df = str_series.str.rsplit(n=5, expand=True) # 3. 设置列名,将后5列转为数值类型(Pandas自动识别int/float格式) df.columns = ['country', 'value1', 'value2', 'value3', 'value4', 'value5'] df.iloc[:, 1:] = df.iloc[:, 1:].apply(pd.to_numeric)
结果验证
执行print(df)可得到符合要求的结构化数据:
country value1 value2 value3 value4 value5 0 Korea, Republic of 0.07 40 13 13 153 1 United States 0.22 8 3 4 109 2 Argentina 0.19 10 14 17 33
执行print(df.dtypes)可验证列类型完全符合要求:
country object value1 float64 value2 int64 value3 int64 value4 int64 value5 int64 dtype: object
- 备选正则方案(熟悉正则时可选用):
如果偏好正则一次性提取内容,可以用str.extract方法,匹配规则简单,示例代码如下:
# 正则一次性匹配国家名+5个数值,直接拆分为6列 df = str_series.str.extract(r'^(.*?)\s+([\d.]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$') # 后续设置列名、转数值类型的步骤和上述方案一致
内容的提问来源于stack exchange,提问作者Cummins070
相关产品推荐
相关产品推荐

