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

时间:2014-02-06 15:26:26

标签: python pandas

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

当我检查结果数据帧的列时,如下所示:

df.columns

结果如下:

Index(['Year', 'Month ', 'Value'])

因此,我无法运行

df["Month"]

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

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

4 个答案:

答案 0 :(得分:96)

您可以为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]

答案 1 :(得分:45)

如果您使用的是最新版本,现在可以在列上调用.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来说可以更好地扩展

答案 2 :(得分:0)

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

skipinitialspace=True

致电pd.read_csv时。

来自documentation

  

skipinitialspace:布尔,默认为False

Skip spaces after delimiter.

答案 3 :(得分:0)

如果您正在寻找一种牢不可破的方法,我建议:

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