2016-04-23 67 views
4

使用文件中的標頭導入了一系列csv和xls文件。我注意到這些頭文件並不乾淨,所以當我打電話給他們時,我得到一個錯誤,說有沒有這樣的屬性。我正在尋找的是類似於此的東西;在導入的熊貓數據框中清理標頭

使用內置的函數來創建進口頭的列表

currentheaders = list(df.columns.values) 

清潔該列表(這是我很卡上的部分)

cleanedheaders = str.strip or regex equivalent 

應用該列表作爲新標題

df.columns = ['cleanedheaders'] 

帶不工作列表和正則表達式想成爲一個數據框,是否有一個等效的函數n列表?

+0

請定義「不乾淨」。並請提供一些可執行的代碼和數據位;這可能有助於獲得答案。 – tfv

+0

大多數情況下,您不僅會遇到問題,還會遇到數據問題。所以你應該嘗試爲'sep'參數找到合適的值。 – MaxU

+2

如果你只是想剝離你的列名:'df.columns = df.columns.str。strip()' – MaxU

回答

1

緊湊和曲ICK的辦法是

df.columns = [c.strip() for c in df.columns.values.tolist()] 

如果你想使用DataFrame.rename(),那麼你實際上將需要調用它像:

df.rename(columns={c: c.strip() for c in df.columns.values.tolist()}, inplace=True) 

或你當然可以使用也緊湊和快速(由MaxU借用):

df.columns = df.columns.str.strip() 

請記住,如果任何列名實際上不是字符串,上述解決方案都不起作用。

如果任何列名的不是一個字符串,那麼最好你將他們都轉成字符串,這會工作:

df.columns = [str(i) for i in df.columns.values.tolist()] 

,或者如果你不想把列名字符串 - 有一個很好的理由,我希望 - 那麼你將不得不這樣做:

df.rename(columns={c: c.strip() for c in df.columns.values.tolist() 
         if c not in [<list of columns not strings>]}, inplace=True) 
+0

感謝Thanos的解釋,他們幸運地是所有的弦,所以Maxs的方法工作 –

1

該解決方案將去除所有元素中的列表:

list = [' test1', ' test2 '] 
print [l.strip() for l in list] 

結果:

[ 'TEST1', 'TEST2']

3

嘗試這種情況:

columns = {c: c.strip() for c in df.columns} # or any cleaning 
df.rename(columns, inplace=True)