我一直在尝试读取这样的自定义 csv 文件:
6 Rotterdam NLD Zuid-Holland 593321
19 Zaanstad NLD Noord-Holland 135621
214 Porto Alegre BRA Rio Grande do Sul 1314032
397 Lauro de Freitas BRA Bahia 109236
547 Dobric BGR Varna 100399
552 Bujumbura BDI Bujumbura 300000
554 Santiago de Chile CHL Santiago 4703954
626 al-Minya EGY al-Minya 201360
646 Santa Ana SLV Santa Ana 139389
762 Bahir Dar ETH Amhara 96140
123 Chicago 10000
222 New York 200000
我尝试了正则表达式https://regex101.com/以下代码有效:
这有效
# https://regex101.com/
s = "6 Rotterdam NLD Zuid-Holland 593321 "
pat = r'(\d+)\s+([\D]+)\s(\d+)\s+'
m = re.match(pat,s)
m.groups() # ('6', 'Rotterdam NLD Zuid-Holland', '593321')
我得到了正确的答案,但是当我将代码应用于 pandas read_csv 时,不知何故它无法工作。
我的尝试
import numpy as np
import pandas as pd
from io import StringIO
s = """6 Rotterdam NLD Zuid-Holland 593321
19 Zaanstad NLD Noord-Holland 135621
214 Porto Alegre BRA Rio Grande do Sul 1314032
397 Lauro de Freitas BRA Bahia 109236
547 Dobric BGR Varna 100399
552 Bujumbura BDI Bujumbura 300000
554 Santiago de Chile CHL Santiago 4703954
626 al-Minya EGY al-Minya 201360
646 Santa Ana SLV Santa Ana 139389
762 Bahir Dar ETH Amhara 96140
123 Chicago 10000
222 New York 200000 """;
sep = r'(\d+)\s+|([\D]+)\s+|(\d+)\s+'
df = pd.read_csv(StringIO(s), sep=sep,engine='python')
df
我得到了很多 Nans,如何只得到 3 列?
Column names are: ID CITY POPULATION
类似的问题
- 如何读取pandas中包含数字字符串数字的自定义表?
您使用该模式match(提取)文本,但在 pandas 方法中你是分裂与图案。
如果每行开头只能有 1、2 或 3 位数字,请使用
sep = r'(?:(?<=^\d)|(?<=^\d{2})|(?<=^\d{3}))\s+|\s+(?=\S+\s*$)'
See the 正则表达式演示。您可以通过在第一个非捕获组中添加更多后视来扩展它。
Details
-
(?:(?<=^\d)|(?<=^\d{2})|(?<=^\d{3}))\s+
- 1+ 个空格 (\s+
) 前面带有 1 位数字 (\d
), 或 2 位数字 (\d{2}
), 或 3 位数字 (\d{3}
) 在字符串 (^
)
-
|
- or
-
\s+(?=\S+\s*$)
- 1+ 个空格后跟 1+ 个非空格字符,然后是字符串末尾之前的任何尾随 0+ 个空格。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)