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 DataFrame
和pandas.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
是一个用于解析和转换文本的命令行实用程序(您可以在每个操作系统中使用它);
<./input.csv sed
将输入文件的内容发送到sed
;
s/([0-9]+),(.+),([0-9]+)/\1,"\2",\3/g
是通过正则表达式搜索和替换 https://regex101.com/r/WRzcEW/1 (在右上角找到解释);
>./output.csv
保存输出
【讨论】:
大家好,我没看懂代码...以上是关于CSV 列中的逗号值 - 无效代码的主要内容,如果未能解决你的问题,请参考以下文章