【发布时间】:2020-04-10 23:19:30
【问题描述】:
我一直在尝试读取这样的自定义 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 方法中,您与模式拆分。每行的开头可以有多少位数字?
-
@WiktorStribiżew 我试过
sep = r'(\d+)\s+([\D]+)\s+(\d+)\s+'它只给出一列。 -
如果每行只能有 1、2 或 3 位数字,试试
sep = r'(?:(?<=^\d)|(?<=^\d{2})|(?<=^\d{3}))\s+|\s+(?=\S+\s*$)' -
@WiktorStribiżew 这个问题只是我数据集的一部分。现在,它适用于我的完整数据集,如果您作为答案发布,我将很乐意接受。