CSV 列中的逗号值 - 无效代码

Comma values in a column of CSV - not working code

我有包含以下数据的 CSV 文件。

**Source data:**

CODE,Name,Value
1,ABC (CEF) CO.,XYZ,500
2,GOOD VALUE  CO., XYZ,20

预期输出:

但是由于名称列中的逗号值,python pandas 无法正确读取数据。 我在下面使用 link。但没有工作。 XYZ 在 ABC (CEF) CO.,XYZ 中被截断。

pattern = '[:;\?\.<\'/]' # I use \ to ignore characters that are used in regex :)
df['Name_Clean'] = df['Name'].str.replace(pattern, '').str.strip()

请帮助我。

我在下面尝试了一个可行的解决方案,使用 Read a table of fixed-width formatted lines into DataFramepandas.read_fwf() 方法并分配一个临时列名 col1.

您的原始数据:

$ cat source_data.csv
CODE,Name,Value
1,ABC (CEF) CO.,XYZ,500
2,GOOD VALUE  CO., XYZ,20

数据框:

>>> df =  pd.read_fwf('source_data.csv', names=['col1'])
>>> df
                        col1
0            CODE,Name,Value
1    1,ABC (CEF) CO.,XYZ,500
2  2,GOOD VALUE  CO., XYZ,20

解决方案:

因此,当您使用 str.extract 时,您将看到 NaN 个值,您可以使用 dropna() 删除这些值,然后使用 rename 分配所需的列名称因为提取的名称只是整数 ..

   >>> df.col1.str.extract('(\d+)\,(\D+)\,(\d+)')
     0                     1    2
0  NaN                   NaN  NaN
1    1     ABC (CEF) CO.,XYZ  500
2    2  GOOD VALUE  CO., XYZ   20

期望:

>>> df.col1.str.extract('(\d+)\,(\D+)\,(\d+)').dropna().rename(columns={0:'CODE', 1:'Name', 2:'Value'}).dropna()
  CODE                  Name Value
1    1     ABC (CEF) CO.,XYZ   500
2    2  GOOD VALUE  CO., XYZ    20

如果您想重命名创建字典的列名称,请尝试..

>>> cols={0:'CODE', 1:'Name', 2:'Value'}
>>> df.col1.str.extract('(\d+)\,(\D+)\,(\d+)').dropna().rename(columns=cols).dropna()
  CODE                  Name Value
1    1     ABC (CEF) CO.,XYZ   500
2    2  GOOD VALUE  CO., XYZ    20

正则表达式解释:

'(\d+)\,(\D+)\,(\d+)'


1st Capturing Group (\d+)
\d+ matches a digit (equal to [0-9])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)

\, matches the character , literally (case sensitive)

2nd Capturing Group (\D+)
\D+ matches any character that\'s not a digit (equal to [^0-9])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)

\, matches the character , literally (case sensitive)

3rd Capturing Group (\d+)
\d+ matches a digit (equal to [0-9])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)

希望这会有所帮助。

我认为最好的解决办法是更正您的 CSV。从

开始
CODE,Name,Value
1,ABC (CEF) CO.,XYZ,500
2,GOOD VALUE  CO., XYZ,20

并申请

<./input.csv sed -r 's/([0-9]+),(.+),([0-9]+)/,"",/g' >./output.csv

您将获得格式正确的 CSV

CODE,Name,Value
1,"ABC (CEF) CO.,XYZ",500
2,"GOOD VALUE  CO., XYZ",20

关于命令的一些注意事项:

  • sed 是一个解析和转换文本的命令行实用程序(您可以在每个操作系统中使用它);
  • <./input.csv sed 将输入文件的内容发送到 sed;
  • s/([0-9]+),(.+),([0-9]+)/,"",/g 是通过正则表达式搜索和替换 https://regex101.com/r/WRzcEW/1 (在右上角找到解释);
  • >./output.csv 保存输出