Изменение типа некоторых имен столбцов во фрейме данных

#pandas #dataframe

#pandas #фрейм данных

Вопрос:

Допустим, я работаю со следующим фреймом данных :

 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]})
 

Я хотел бы изменить имена столбцов с плавающей запятой на целые числа, как я могу это сделать?

Ответ №1:

Попробуйте использовать это isinstance , чтобы проверить тип данных и преобразовать объекты типа float в 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)
 
    Country  2006  2007  2008
0      USA     1     5     4
1       UK     4     4     8
2   France     5     8     4
3  Germany     6     5     7
 

Вы могли бы использовать a df.rename(columns = {"old name": "new name"}) для обработки только определенного переименования столбцов, но это только усложнило бы проблему.


РЕДАКТИРОВАТЬ: другой подход с boolean mask и 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)
 
    Country  2006  2007  2008
0      USA     1     5     4
1       UK     4     4     8
2   France     5     8     4
3  Germany     6     5     7
 

Комментарии:

1. Так что, нет способа сделать это с помощью логической маски? Я пытался это сделать, но, похоже, многие атрибуты рядов недоступны для объектов индекса

2. Можете ли вы добавить свой подход к вопросу? Я не уверен, что вы имеете в виду using a boolean mask . Может быть, это поможет мне понять. Может быть, вы могли бы уточнить. Конечно, есть несколько способов сделать это.

3. Например, Series.str.isnumeric() проверяет, содержат ли элементы ряда, которые являются ‘str’, числовые значения, и возвращает объект серии с True или False. Затем этот ряд можно использовать для изменения значений, которые проверяют условие

4. Здесь происходит примерно то же самое. Однако существует только 2 способа изменения имен столбцов. pd.rename() и df.columns . Во-первых, нужен dict с конкретными старыми и новыми именами, а во-вторых, нужен полный список имен.

5. Ммм, понятно, я пытался сделать что-то вроде df.columns[df.columns.isnumeric()] = df.columns[df.columns.isnumeric()].astype('int') , но, думаю, мне придется делать это вручную.

Ответ №2:

Вы пытались переназначить

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
 

Комментарии:

1. Это всего лишь пример, у меня может быть база данных с гораздо большим количеством столбцов