我在.csv文件中有一个时间序列数据集,我想用Pandas处理(使用Canopy)。文件中的列名称是字符串和同位素数字的混合。
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
我希望这个DataFrame看起来像这样
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文件并不总是具有完全相同的列名;它们的数字可能会因文件而略有不同。为了解决这个问题,我对列名进行了采样并将值四舍五入到最接近的整数。这就是我的代码到目前为止的样子:
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(columns = {df.loc [1]:colHeaders [0]},...),但是我收到了这个错误:
TypeError: 'Series' objects are mutable, thus they cannot be hashed
我已阅读this帖子以及pandas 0.17文档,但我无法弄清楚如何使用它来选择性地替换列名称,而不需要我分配新的列名称与this post一样手动。
我是Python的新手,我以前从未在StackOverflow上发布过,所以任何帮助都会非常感激。
答案 0 :(得分: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')