Ответ 1
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)
rename
показывает, что он принимает dict как параметр для columns
, поэтому вы просто передаете dict с одной записью.
Также см. .
У меня есть dataframe под названием data
. Как переименовать единственный заголовок столбца? Например, gdp
- log(gdp)
?
data =
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)
rename
показывает, что он принимает dict как параметр для columns
, поэтому вы просто передаете dict с одной записью.
Также см. .
Более быстрая реализация заключалась бы в использовании list-comprehension
, если вам нужно переименовать один столбец.
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
Если возникает необходимость переименовать несколько столбцов, используйте условные выражения, например:
df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]
Или постройте сопоставление с помощью dictionary
и выполните операцию list-comprehension
с ним get
, установив значение по умолчанию в качестве старого имени:
col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'} ## key→old name, value→new name
df.columns = [col_dict.get(x, x) for x in df.columns]
Тайминги:
%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop
%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop
В версии 0.21 были внесены существенные обновления для переименования столбцов.
rename
method добавил параметр axis
, который может быть установлен на columns
или 1
. Это обновление позволяет этому методу соответствовать остальной части pandas API. Он по-прежнему имеет параметры index
и columns
, но вы больше не вынуждены их использовать.set_index
method с inplace
, установленным в False
, позволяет вам переименовать все метки индекса или столбца с помощью список.Построить образец DataFrame:
df = pd.DataFrame({'y':[1,2,8], 'gdp':[2,3,7], 'cap':[5,9,2]},
columns=['y','gdp', 'cap'])
cap gdp y
0 5 2 1
1 9 3 2
2 2 7 8
rename
с axis='columns'
или axis=1
(новый для 0.21)df.rename({'gdp':'log(gdp)'}, axis='columns')
или
df.rename({'gdp':'log(gdp)'}, axis=1)
Оба результата приведут к следующему:
cap log(gdp) y
0 5 2 1
1 9 3 2
2 2 7 8
По-прежнему можно использовать старую подпись метода:
df.rename(columns={'gdp':'log(gdp)'})
Функция rename
также принимает функции, которые будут применяться к каждому имени столбца.
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis='columns')
или
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
set_axis
со списком и inplace=False
Вы можете предоставить список методу set_axis
, равному по длине количеству столбцов (или индекса). В настоящее время inplace
по умолчанию используется True
, но inplace
по умолчанию будет False
в будущих выпусках.
df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
или
df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
df.columns = ['cap', 'log(gdp)', 'y']
?Нет ничего плохого в назначении столбцов прямо так. Это идеальное решение.
Преимущество использования set_axis
заключается в том, что его можно использовать как часть цепочки методов и что он возвращает новую копию DataFrame. Без него вам нужно будет сохранить промежуточные шаги цепочки на другую переменную, прежде чем переназначать столбцы.
# new for pandas 0.21+
df.some_method1()
.some_method2()
.set_axis()
.some_method3()
# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
Вы можете вызвать df.columns.str.replace
.
df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
y log(gdp) cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
Преимущество этого по сравнению с другими методами заключается в том, что вы также можете выполнять замену на основе regex:
df
x1 y1 y2
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
df.columns = df.columns.str.replace(r'y(\d+)$', r'zzzz\1')
df
x1 zzzz1 zzzz2
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7