如何从Pandas DataFrame标头中删除空格?


94

我正在从Excel文件中解析数据,该文件在某些​​列标题中具有额外的空白。

当我使用来检查结果数据框的列时df.columns,我看到:

Index(['Year', 'Month ', 'Value'])
                     ^
#                    Note the unwanted trailing space on 'Month '

因此,我无法执行以下操作:

df["Month"]

因为它会告诉我找不到列,因为我要求输入“ Month”而不是“ Month”。

那么,我的问题是如何从列标题中去除不需要的空白?

Answers:


136

您可以为该rename方法提供功能。该str.strip()方法应做您想要的。

In [5]: df
Out[5]: 
   Year  Month   Value
0     1       2      3

[1 rows x 3 columns]

In [6]: df.rename(columns=lambda x: x.strip())
Out[6]: 
   Year  Month  Value
0     1      2      3

[1 rows x 3 columns]

注意:这将返回一个DataFrame对象,并在屏幕上显示为输出,但是更改实际上并未设置在您的列上。要进行更改,请使用:

  1. 使用inplace=True参数[docs]
df.rename(columns=lambda x: x.strip(), inplace=True)
  1. 将其分配回您的df变量:
df = df.rename(columns=lambda x: x.strip())

63

现在.str.strip,如果您使用的是最新版本,则只需调用列即可:

In [5]:
df = pd.DataFrame(columns=['Year', 'Month ', 'Value'])
print(df.columns.tolist())
df.columns = df.columns.str.strip()
df.columns.tolist()

['Year', 'Month ', 'Value']
Out[5]:
['Year', 'Month', 'Value']

时机

In[26]:
df = pd.DataFrame(columns=[' year', ' month ', ' day', ' asdas ', ' asdas', 'as ', '  sa', ' asdas '])
df
Out[26]: 
Empty DataFrame
Columns: [ year,  month ,  day,  asdas ,  asdas, as ,   sa,  asdas ]


%timeit df.rename(columns=lambda x: x.strip())
%timeit df.columns.str.strip()
1000 loops, best of 3: 293 µs per loop
10000 loops, best of 3: 143 µs per loop

所以str.strip快2倍,我希望这对于较大的dfs可以更好地扩展


8

如果您使用CSV格式从Excel导出并读取为Pandas DataFrame,则可以指定:

skipinitialspace=True

打电话时pd.read_csv

文档中

skipinitialspace:bool,默认为False

Skip spaces after delimiter.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.