Pandas 更改数据框中某些列名的类型

Pandas 更改数据框中某些列名的类型,pandas,dataframe,Pandas,Dataframe,假设我正在使用以下数据帧: data = pd.DataFrame({'Country':['USA','UK','France','Germany'], 2006.0:[1,4,5,6], 2007.0:[5,4,8,5], 2008.0:[4,8,4,7]}) 我想将浮点数的列名更改为整数,我该怎么做?您尝试过重新赋值吗 data.columns=['Country',2006、2007、2008] Country 2006 200

假设我正在使用以下数据帧:

data = pd.DataFrame({'Country':['USA','UK','France','Germany'],
        2006.0:[1,4,5,6],
        2007.0:[5,4,8,5],
        2008.0:[4,8,4,7]})

我想将浮点数的列名更改为整数,我该怎么做?

您尝试过重新赋值吗

data.columns=['Country',2006、2007、2008]

   Country  2006  2007  2008
0      USA     1     5     4
1       UK     4     4     8
2   France     5     8     4
3  Germany     6     5     7

尝试使用
isinstance
检查数据类型并将浮点型对象转换为int。然后重新指定列名

data = pd.DataFrame({'Country':['USA','UK','France','Germany'],
        2006.0:[1,4,5,6],
        2007.0:[5,4,8,5],
        2008.0:[4,8,4,7]})

data.columns = [int(i) if isinstance(i, float) else i for i in data.columns]
print(data)
您可以使用
df.rename(columns={“old name”:“new name”})
只处理特定的列重命名,但这只会使问题过于复杂


编辑:另一种带有
布尔掩码和
df.replace
的方法似乎很复杂

data = pd.DataFrame({'Country':['USA','UK','France','Germany'],
        2006.0:[1,4,5,6],
        2007.0:[5,4,8,5],
        2008.0:[4,8,4,7]})

mask = data.columns.str.isnumeric()!=False
#[False  True  True  True]

g = {k:int(k) for k,v in zip(data.columns, mask) if v==True}
#{2006.0: 2006, 2007.0: 2007, 2008.0: 2008}

data.rename(g, axis=1, inplace=True)
print(data)

这只是一个例子,我可能有一个多列的数据库,所以没有办法使用布尔掩码来实现这一点?我一直在尝试这样做,但似乎系列的许多属性都不可用于索引对象。您是否添加了解决该问题的方法?我不知道你所说的使用布尔掩码的
是什么意思。也许这能帮助我理解。也许你可以详细说明一下。当然,有多种方法可以执行此操作。例如,Series.str.isnumeric()可以测试序列中的“str”元素是否包含数值,并返回一个带True或False的Series对象。然后,这个系列可以用来更改验证条件的值。这里发生的情况与此类似。但是,只有两种方法可以更改列名
pd.rename()
df.columns
。第一个需要一个带有特定新旧名称的dict,第二个需要完整的名称列表。嗯,我明白了,我试图做一些类似于
df.columns[df.columns.isnumeric()]=df.columns[df.columns.isnumeric()].astype('int')
的事情,但我想我必须手动完成。
data = pd.DataFrame({'Country':['USA','UK','France','Germany'],
        2006.0:[1,4,5,6],
        2007.0:[5,4,8,5],
        2008.0:[4,8,4,7]})

mask = data.columns.str.isnumeric()!=False
#[False  True  True  True]

g = {k:int(k) for k,v in zip(data.columns, mask) if v==True}
#{2006.0: 2006, 2007.0: 2007, 2008.0: 2008}

data.rename(g, axis=1, inplace=True)
print(data)
   Country  2006  2007  2008
0      USA     1     5     4
1       UK     4     4     8
2   France     5     8     4
3  Germany     6     5     7