熊猫csv_reader“ sep”参数是否可以使用空格单词和数字?

时间:2019-06-16 22:23:52

标签: python regex pandas csv separator

我正在使用pandas(python)csv_reader,但我不知道在“ sep”参数上使用正则表达式来返回所需的数据帧是否可行或有效。

我正在从单列csv中读取内容,我必须将其转换为11列csv。

我正在尝试实现以下目的的分隔符:

  1. 使用长空格作为分隔符;
  2. 在单词和包含数字的字符串之间使用空格(999-BBB CCCC);
  3. 在包含数字的字符串和一个单词(AAA 999-BBB)之间使用空格。

数据采用这种格式(多行):

111-XXX XX XXXX           AAA 999-BBB CCCC            0,00                  01/01/1950     111.111        22. DDDD        11.111,11       11.111,11       

到目前为止,我只实现了将大空格和带有点的空格分隔为:sep = r“ [。] {2,}”

我需要数据变得像这样:

111-XXX XX XXXX | AAA | 999-BBB| CCCC | 0,00 | 01/01/1950 | 111.111 | 22 | DDDD | 11.111,11 | 11.111,11 

尝试检测后跟空格的数字(将AAA从999-BBB拆分为“ [] [0-9]”)也会导致删除第一个数字(导致99-BBB),这是不希望的。

到目前为止,这是我的代码:

df = pd.read_csv("myarchive.csv",
                 sep=r"[ .]{2,}",
                 engine="python",
                 names = col,
                 usecols = col,
                 na_filter=False,
                 keep_default_na=False)

1 个答案:

答案 0 :(得分:1)

通过delim_whitespace=True参数。 从文档中:

  

delim_whitespace:bool,默认为False

     

指定是否将空格(例如''或'')用作分隔符。等效于设置sep ='\ s +'。如果将此选项设置为True,则分隔符参数不应传递任何内容。

然后手动修复第一个字段。

编辑:如果格式始终相同,也可以使用read_fwf

widths = [
    15,  # 111-XXX XX XXXX
    14,  # AAA
    8,   # 999-BBB
    16,  # CCCC
    16,  # 0,00
    17,  # 01/01/1950
    16,  # 111.111
    7,   # 22.
    5,   # DDDD
    17,  # 11.111,11
    16,  # 11.111,11
]
df = pd.read_fwf('test.csv', widths=widths, header=None)
print(df.values)