Как добавить суффикс (или префикс) к имени каждого столбца?

88

Я хочу добавить _xсуффикс к имени каждого столбца, например:

featuresA = myPandasDataFrame.columns.values + '_x'

Как мне это сделать? Кроме того, если бы я хотел добавить x_суффикс, как бы изменилось решение?

Клаусос Клаусос
источник

Ответы:

121

Вы можете использовать listпонимание:

df.columns = [str(col) + '_x' for col in df.columns]

Существуют также встроенные методы, такие как .add_suffix()и, .add_prefix()как упоминалось в другом ответе.

Стефан
источник
это самый простой и элегантный ответ!
Jinhua Wang
163

На мой взгляд, это лучший способ добавить суффикс.

df = df.add_suffix('_some_suffix')

Поскольку это функция, которая вызывается в DataFrame и возвращает DataFrame, вы можете использовать ее в цепочке вызовов.

Ярослав Шимчак
источник
14
Вы можете использовать add_prefix, если хотите добавить префикс к именам.
Хорхе
9
Жаль, что это не может быть изменяемым (т.е. не имеет inplace=Trueопции параметра). В остальном идеально.
ijoseph 06
Я думаю, что в некоторых случаях это лучше, чем принятый ответ, потому что его можно использовать в цепочке операций в одном операторе, а не в отдельном операторе.
Captain
@CaptainLepton когда бы не этот ответ будет лучше , чем общепринятом ответ
Baxx
1
Если суффикс не постоянный. В названии говорится о суффиксах. Сообщение сужает объем до одного постоянного суффикса, но если мы отвечаем на заголовок сообщения в общих чертах, то установка столбцов с помощью понимания списка или другого итеративного метода более гибкая
капитан Лептон,
17

Элегантная конкатенация на месте

Если вы пытаетесь изменить dfна месте, то самый дешевый (и самый простой) вариант - это добавление на месте непосредственно df.columns(т. Е. С использованием Index.__iadd__).

df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
df

   A   B
0  9  12
1  4   7
2  2   5
3  1   4

df.columns += '_some_suffix'
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Чтобы добавить префикс, вы также должны использовать

df.columns = 'some_prefix_' + df.columns
df

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Другой дешевый вариант - использовать понимание списка с f-stringформатированием (доступно на python3.6 +).

df.columns = [f'{c}_some_suffix' for c in df]
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

И для префикса аналогично

df.columns = [f'some_prefix{c}' for c in df]

Цепочка методов

Также возможно добавить * исправления при связывании методов. Чтобы добавить суффикс, используйтеDataFrame.add_suffix

df.add_suffix('_some_suffix')

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Это возвращает копию данных. IOW, dfне модифицируется.

Добавление префиксов также выполняется с помощью DataFrame.add_prefix.

df.add_prefix('some_prefix_')

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Что тоже не модифицирует df.


Критика add_*fix

Это хорошие методы, если вы пытаетесь выполнить цепочку методов:

df.some_method1().some_method2().add_*fix(...)

Однако add_prefixadd_suffix) создает копию всего фрейма данных только для изменения заголовков. Если вы считаете, что это расточительно, но все же хотите использовать цепочку, вы можете позвонить pipe:

def add_suffix(df):
    df.columns += '_some_suffix'
    return df

df.some_method1().some_method2().pipe(add_suffix)
cs95
источник
Это элегантно! Что, если вы хотите добавить префикс или суффикс к подмножеству столбцов, например к столбцам, имена которых содержат общее слово (например, newили old) вместо каждого столбца? Спасибо.
Боуэн Лю
1
@BowenLiu Я бы предложил вместо этого использовать df.rename () ... Передайте имена сопоставления словаря их новым именам. Затем вызовите переименование с осью = 1. Вы также можете использовать условное присвоение понимания списка.
cs95
Работает только с обычными типами данных в качестве имен столбцов, а не если ваши столбцы являются RangeIndex, например, df = pd.DataFrame([[1,2,3]]*10)-> df.columns, тогда вы должны использоватьdf.add_suffix('_x')
Лоренц
вы можете сделать так, df.columns = df.columns.astype(str) + '_x' как показывает мой первый метод.
cs95,
4

Я не видел этого решения, предложенного выше, поэтому добавляю его в список:

df.columns += '_x'

И вы можете легко адаптироваться к префиксному сценарию.

JPA
источник
Лучшее решение для суффикса, хотя, конечно, его нельзя использовать для префикса.
Лоренц
Работает только с обычными типами данных в именах столбцов, а не если ваши столбцы представляют собой RangeIndex, например df = pd.DataFrame([[1,2,3]]*10)-> df.columns, тогда вы должны использоватьdf.add_suffix('_x')
Лоренц
1

Я знаю 4 способа добавить суффикс (или префикс) к именам столбцов:

1- df.columns = [str(col) + '_some_suffix' for col in df.columns]

или

2- df.rename(columns= lambda col: col+'_some_suffix')

или

3- df.columns += '_some_suffix'намного проще.

или, самое приятное:

3- df.add_suffix('_some_suffix')

Махмуд Реда
источник
0

Использование DataFrame.rename.

Прекращение поддержки add_prefixиadd_suffix

В будущих версиях pandas add_prefixи add_suffixбудут объявлены устаревшими . Новый рекомендованный метод заключается в использовании DataFrame.rename:

df = pd.DataFrame({'A': range(3), 'B': range(4, 7)})
print(df)
   A  B
0  0  4
1  1  5
2  2  6

Использование форматирования строк renameс помощью axis=1и:

df.rename('col_{}'.format, axis=1)
# or df.rename(columns='col_{}'.format)

   col_A  col_B
0      0      4
1      1      5
2      2      6

Чтобы фактически перезаписать имена столбцов, мы можем присвоить возвращаемые значения нашим df:

df = df.rename('col_{}'.format, axis=1)

или используйте inplace=True:

df.rename('col_{}'.format, axis=1, inplace=True)
Эрфан
источник