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 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)
希望这会有所帮助。
我认为最好的解决办法是更正您的 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
保存输出
我有包含以下数据的 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 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)
希望这会有所帮助。
我认为最好的解决办法是更正您的 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
保存输出