有选择地替换DataFrames列名称

时间:2015-11-14 01:01:15

标签: python pandas

我在.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上发布过,所以任何帮助都会非常感激。

1 个答案:

答案 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')