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

Posted

技术标签:

【中文标题】CSV 列中的逗号值 - 无效代码【英文标题】:Comma values in a column of CSV - not working code 【发布时间】:2019-09-11 04:01:48 【问题描述】:

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

**Source data:**

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

预期输出:

但由于名称列中的逗号值,python pandas 无法正确读取数据。 我使用了下面的链接。但不工作。 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()

Unable to remove special characters ;:??/?<

请帮帮我。

【问题讨论】:

你显示的数据是Source data是一列吗?你想要的输出是什么,你能证明一下吗? 源数据是文件名。名称是列名。源值 =ABC (CEF) CO.,XYZ & 目标值 =ABC (CEF) CO.,XYZ。但是名称中缺少 XYZ 你看到的预期输出是什么? 嗨@KarnKumar,更新了帖子。请检查。谢谢 好的,如果你这样做df = pd.read_csv('source_data.csv'),因为它的逗号分隔文件应该可以工作。 【参考方案1】:

我在下面尝试了一个可行的解决方案,使用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)

希望这会有所帮助。

【讨论】:

嗨 Karn Kumar,我有 25 列包含日期、文本、数字、字母数字。我对d,Ds感到困惑。请指教。【参考方案2】:

我认为最好的解决方案是更正您的 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]+)/\1,"\2",\3/g' >./output.csv

您将获得格式正确的 CSV

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

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

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

【讨论】:

大家好,我没看懂代码... 嗨@PythonWizard 我在回复中为你添加了一些最后的注释

以上是关于CSV 列中的逗号值 - 无效代码的主要内容,如果未能解决你的问题,请参考以下文章

用逗号分隔 HashMap 输出到 .csv

如何在csv列中使用逗号[重复]

熊猫在列中使用额外的逗号读取 csv

包含逗号分隔值的列中的值

TSQL 将列中的逗号分隔值与逗号分隔参数进行比较

如何根据列中的逗号分隔值进行选择