我在 .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 上发过帖子,因此我们将不胜感激。
最佳答案
您可以使用方法的变体,但直接分配新列:
>>> 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')
或者您可以传递一个函数来重命名
:
>>> 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')
关于python - 有选择地替换 DataFrames 列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33704023/