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

Spi*_*ams 68 python pandas

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

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

df.columns

结果如下:

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

因此,我无法逃避

df["Month"]

因为它会告诉我找不到列,因为我要求"月",而不是"月".

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

Tom*_*ger 105

您可以为该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]
Run Code Online (Sandbox Code Playgroud)

  • 这将返回一个新的DataFrame对象.为了能够引用`df ["Month"]`,你需要添加`inplace = True`作为`rename`方法的参数. (21认同)
  • 这是一个很好的答案,因为在链接操作时也可以使用它。pd.read_csv(fname).rename(columns = lambda x:x.strip())) (2认同)

EdC*_*ica 52

.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']
Run Code Online (Sandbox Code Playgroud)

计时

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
Run Code Online (Sandbox Code Playgroud)

所以str.strip速度提高约2倍,我希望这能够更好地扩展到更大的dfs


Eri*_*nil 13

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

skipinitialspace=True
Run Code Online (Sandbox Code Playgroud)

打电话时pd.read_csv

文档

skipinitialspace : bool,默认为 False

Skip spaces after delimiter.
Run Code Online (Sandbox Code Playgroud)

  • 根据OP的示例,这不会跳过尾随空格。似乎没有合理的方法来做到这一点,特别是对于创建多索引的多行标题。这是可以做到的,但应该更容易。 (2认同)