Python 尾随空格导致列名在read_csv中与usecols不匹配

Python 尾随空格导致列名在read_csv中与usecols不匹配,python,pandas,csv,Python,Pandas,Csv,我有几千个类似格式的csv文件,我在两列中分别阅读它们。它们的顺序可能不同,主要问题似乎是每行末尾都有一个尾随空格,包括标题。假设我有几个标题如下所示: 'apple','banana','orange ' 'banana','kiwi','apple ' 'grape','apple','banana ' 我在for循环中这样做是为了将所有数据保存在dict中: results[fruitfilepath] = pd.read_csv(fruitfilepath,usecols=['appl

我有几千个类似格式的csv文件,我在两列中分别阅读它们。它们的顺序可能不同,主要问题似乎是每行末尾都有一个尾随空格,包括标题。假设我有几个标题如下所示:

'apple','banana','orange '
'banana','kiwi','apple '
'grape','apple','banana '
我在for循环中这样做是为了将所有数据保存在dict中:

results[fruitfilepath] = pd.read_csv(fruitfilepath,usecols=['apple', 'banana']
它一直工作到它碰到一个文件,最后一列是“apple”或“banana”,因此在它后面有一个空格

理论上,我可以想出三种方法来解决这个问题,但我正在努力实现它们

第一,有没有办法在usecols中包含通配符?类似于以下内容的内容(不起作用)

第二,使用多个列名,但以某种方式触发read_csv跳过文件中不存在的列

results[fruitfilepath] = pd.read_csv(fruitfilepath,usecols=['apple', 'banana','apple ', 'banana ']
第三,通过删除所有尾随空格来预处理所有文件。这相当简单,但似乎有些过分,我认为有更好的方法


第四,我还遗漏了什么?

我认为您可以结合第二和第三选项,通过读取第一行并动态计算应调用哪些标题来手动设置列名

阅读第一行以获取当前列名的列表

headers_df = pd.read_csv("mydata.csv", nrows=1, header = None)
将标题转换为列表

headers = headers_df.values.tolist()[0]
修复列名以删除空格

fixed_headers = [x.strip(' ') for x in headers]
手动将文件头替换为固定的文件头,选择所需的两个文件头

d = pd.read_csv('test.csv', header=0, names=fixed_headers, usecols=['apple','banana'])

我认为您可以结合第二和第三个选项,通过读取第一行并动态计算出应该调用哪些标题来手动设置列名

阅读第一行以获取当前列名的列表

headers_df = pd.read_csv("mydata.csv", nrows=1, header = None)
将标题转换为列表

headers = headers_df.values.tolist()[0]
修复列名以删除空格

fixed_headers = [x.strip(' ') for x in headers]
手动将文件头替换为固定的文件头,选择所需的两个文件头

d = pd.read_csv('test.csv', header=0, names=fixed_headers, usecols=['apple','banana'])

df.columns
中插入原始
n-1
列+最后一列减去最后一个字符的列表

df.columns = df.columns[:-1].to_list() + [df.columns[-1][:-1]]
例如:

df = pd.DataFrame({'a': [1, 2], 'b': [2, 3], 'cd': [3, 4]})
df.columns = df.columns[:-1].to_list() + [df.columns[-1][:-1]]
df.columns
输出:
索引(['a','b','c',dtype='object')


这就是我的方法,(我认为)您可以对
df.columns[-1]
执行任何字符串操作,将原始
n-1
列+最后一列减去最后一个字符的列表插入
df.columns

df.columns = df.columns[:-1].to_list() + [df.columns[-1][:-1]]
例如:

df = pd.DataFrame({'a': [1, 2], 'b': [2, 3], 'cd': [3, 4]})
df.columns = df.columns[:-1].to_list() + [df.columns[-1][:-1]]
df.columns
输出:
索引(['a','b','c',dtype='object')


这是我的方法,(我认为)你可以在
df.columns[-1]

上做任何你想做的字符串操作看起来你可能可以使用“转换器”来重命名列看起来你可能可以使用“转换器”来重命名列,但是你首先如何获得df.columns?@JeffUK每个数据帧都有列。如果我正确理解OP的代码,他会将数据帧加载到字典中,因此在他的代码中,应该是
results[fruitfilepath].columns
@JeffUK如果我之前的评论很明显,而这不是你想让我回答的,也许我没有真正看到问题所在。据我所知,OP可以将他的csv文件加载到一个数据帧中,问题是其中一列(最后一列)被命名为带有尾随空格的
banana
。当他试图使用
df['banana']
访问该列时,他得到了一个关键错误,因为正确的列名是
banana
(这里也有尾随空格)。但是首先如何获得df.columns呢?@JeffUK每个数据帧都有列。如果我正确理解OP的代码,他会将数据帧加载到字典中,因此在他的代码中,应该是
results[fruitfilepath].columns
@JeffUK如果我之前的评论很明显,而这不是你想让我回答的,也许我没有真正看到问题所在。据我所知,OP可以将他的csv文件加载到一个数据帧中,问题是其中一列(最后一列)被命名为带有尾随空格的
banana
。当他试图使用
df['banana']
访问该列时,他得到了一个关键错误,因为正确的列名是
banana
(这里也是尾随空格)。非常简单,谢谢!为了以防万一有人来参考,你的第一行有一个大写字母H的小打字错误。很好很简单,谢谢!为了以防万一有人来参考,你在第一行有一个大写字母H的小打字错误。