我正在阅读一个基本的csv文件,其中的列用逗号分隔,列名称如下: userid, username, body 然而,body列是一个可能包含逗号的字符串。显然这会导致一个问题,pandas会抛出一个错误: CParserError: Error tokenizing data. C error: Expected 3 fields in line 3, saw 8 有没有一种方法可以告诉pandas忽略特定列中的逗号,或者有没有一种方法可以解决这个问题?
def manual_separation(bad_line):
right_split = bad_line[:-2] + [",".join(bad_line[-2:])] # All the "bad lines" where all coming from the same last column that was containing ","
return right_split
filename = "netflix_movie_titles.csv"
df = pd.read_csv(
filename,
header=None,
encoding="ISO-8859-1",
names = ['Movie_Id', 'Year', 'Name'],
on_bad_lines=manual_separation,
engine="python",
)
userid username body
0 1 Joe string1
1 2 Jim "string21
第二种解决方法更复杂,但它会产生带逗号的完整字符串。原理是用分号替换前2个逗号(您必须知道列数)
with open(path, 'r') as f:
fo = io.StringIO()
data = f.readlines()
fo.writelines(u"" + line.replace(';', ':').replace(',', ';', 2) for line in data)
fo.seek(0)
df = pd.read_csv(fo, on_bad_lines='warn', sep=';')
5条答案
按热度按时间7ajki6be1#
假设我们正在阅读名为
comma.csv
的 Dataframe :您可以做的一件事是指定列中字符串的分隔符:
在这种情况下,由
'
分隔的字符串被认为是total,无论它们内部是否有逗号。nhhxz33t2#
将usecols和linetimator添加到read_csv()函数中,其中n是列的len。
在我的例子中:
4si2a6ki3#
对我来说,上面的代码示例都不起作用(我在Kaggle上处理Netflix Prize数据集),但实际上pandas版本1.3.0+有一个很酷的功能,它是一个
on_bad_lines
参数,可以让你使用回调函数。下面是我所做的:工作起来很有魅力!你唯一的义务就是使用
engine=python
。希望对你有帮助!wvmv3b1j4#
这个有用吗
参考文献:
[1][https://stackoverflow.com/a/40477760/6907424](https://stackoverflow.com/a/40477760/6907424)
[2]为了解决“UnicodeDecodeError:“charmap”编解码器无法解码位置157中的字节0x8f:字符Map到undefined”:https://stackoverflow.com/a/9233174/6907424
t9aqgxwy5#
首先,我没有找到任何东西来解决“comma inside qoutes,issue”系统和正确。pandas=1.5.3无法正确解析它。尝试指定参数,如qoutechar,quoting,escapechar,linetimator,...
最后,利用我知道逗号只能在最后一列的优势,找到了两个变通的解决方案
如果您不介意第三个逗号后的部分丢失,请指定列数
从而产生
第二种解决方法更复杂,但它会产生带逗号的完整字符串。原理是用分号替换前2个逗号(您必须知道列数)
也许它也可以通过regex来实现。