如何从熊猫数据框头中去除空格?

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

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

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

因此,我不能这样做:

df["Month"]

因为它会告诉我没有找到列,因为我要的是“月”,而不是“月”。

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

102513 次浏览

You can give functions to the rename method. The str.strip() method should do what you want:

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对象,并在屏幕上显示为输出,但是实际上并没有在列上设置更改。要进行更改,可以在方法链中使用这个变量,也可以重新分配 df变量:

df = df.rename(columns=lambda x: x.strip())

Since 版本0.16.1 you can just call .str.strip on the columns:

df.columns = df.columns.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 来说可以扩展得更好

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

skipinitialspace=True

pd.read_csv的时候。

From the 文件:

Skipinitialspace: bool,default False

Skip spaces after delimiter.

如果你正在寻找一种牢不可破的方法来做到这一点,我建议你:

data_frame.rename(columns=lambda x: x.strip() if isinstance(x, str) else x, inplace=True)

实际上可以做到这一点

df.rename(str.strip, axis = 'columns')

熊猫文档中有提到 这里