2015-11-14 68 views
1

我在.csv文件中有一個時間序列數據集,我想用Pandas處理(使用Canopy)。文件中的列名是字符串和同位素數字的混合。有選擇地替換DataFrame列名

cycles  40 38.02 35.98  P4 
0  1 1.1e-8 4.4e-8 7.7e-8 8.8e-7 
1  2 2.2e-8 5.5e-8 8.8e-8 8.7e-7 
2  3 3.3e-8 6.6e-8 9.9e-8 8.6e-7 

我想這個數據幀,看起來像這樣

cycles  40  38  36  P4 
0  1 1.1e-8 4.4e-8 7.7e-8 8.8e-7 
1  2 2.2e-8 5.5e-8 8.8e-8 8.7e-7 
2  3 3.3e-8 6.6e-8 9.9e-8 8.6e-7 

該.csv文件不會總是具有完全相同的列名;他們的數字可能會略有不同,從文件到文件。爲了解決這個問題,我已經採樣的列名,並四捨五入的值到最近integer.This是我的代碼看起來像至今:

import pandas as pd 
import numpy as np 

df = {'cycles':[1,2,3],'40':[1.1e-8,2.2e-8,3.3e-8],'38.02':[4.4e-8,5.5e-8, 6.6e-8],'35.98':[7.7e-8,8.8e-8,9.9e-8,],'P4':[8.8e-7,8.7e-7,8.6e-7]} 
df = pd.DataFrame(df, columns=['cycles', '40', '38.02', '35.98', 'P4']) 

colHeaders = df.columns.values.tolist() 
colHeaders[1:4] = list(map(float, colHeaders[1:4])) 
colHeaders[1:4] = list(map(np.around, colHeaders[1:4])) 
colHeaders[1:4] = list(map(int, colHeaders[1:4])) 
colHeaders = list(map(str, colHeaders)) 

我試圖df.rename(列= {df.loc [ 1]:colHeaders [0]},...),但我得到這個錯誤:

TypeError: 'Series' objects are mutable, thus they cannot be hashed 

我讀過this後還有熊貓0.17文檔,但我無法弄清楚如何使用它來選擇性地替換列名,而不需要我手動分配新列名,如this post

我是相當新的Python,我從來沒有發佈在StackOverflow之前,所以任何幫助將不勝感激。

回答

1

你可以用你的方法的一個變種,而是直接分配新列:

>>> cols = list(df.columns) 
>>> cols[1:-1] = [int(round(float(x))) for x in cols[1:-1]] 
>>> df.columns = cols 
>>> df 
    cycles   40   38   36   P4 
0  1 1.100000e-08 4.400000e-08 7.700000e-08 8.800000e-07 
1  2 2.200000e-08 5.500000e-08 8.800000e-08 8.700000e-07 
2  3 3.300000e-08 6.600000e-08 9.900000e-08 8.600000e-07 
>>> df.columns 
Index(['cycles', 40, 38, 36, 'P4'], dtype='object') 

或者你可以通過一個函數來rename

>>> df = df.rename(columns=lambda x: x if x[0].isalpha() else int(round(float(x)))) 
>>> df.columns 
Index(['cycles', 40, 38, 36, 'P4'], dtype='object') 
+0

謝謝,這是乾淨多了。下一步是用'Xe132'從'40'到'Ar40'和'132',這就是爲什麼我希望用一個新的列名列表覆蓋所有列名的方法。這是更好地處理手動重命名? – Icarus