Як додати суфікс (або префікс) до кожного імені стовпця?


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

164

На мою думку, це найкращий спосіб додати суфікс.

df = df.add_suffix('_some_suffix')

Оскільки це функція, яка викликається на DataFrame і повертає DataFrame - ви можете використовувати її в ланцюжку викликів.


14
Ви можете використовувати add_prefix, якщо хочете додати префікс до імен.
Хорхе

9
Шкода, що це не може бути змінним (тобто не має inplace=Trueпараметра параметра). В іншому випадку ідеально.
ijoseph

Я думаю, що це краще, ніж прийнята відповідь за певних обставин, оскільки її можна використовувати в ланцюжку операцій в одному висловлюванні, а не потребувати власного висловлювання.
Капітан Лептон

@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)

Це елегантно! Що робити, якщо ви хочете додати префікс або суфікс до підмножини стовпців, наприклад, стовпці, імена яких містять загальне слово (наприклад, newабо old) замість кожного стовпця? Дякую.
Боуен Лю

1
@BowenLiu Я б запропонував замість цього використовувати df.rename () ... Передати імена словників, що відображають їх нові імена. Потім зателефонуйте до перейменування з осі = 1. Ви також можете використати умовне присвоєння списку.
cs95

Працює лише зі звичайними типами даних як іменами стовпців, а не якщо ваші стовпці є RangeIndex, як, наприклад, df = pd.DataFrame([[1,2,3]]*10)-> df.columns, тоді ви б використовувалиdf.add_suffix('_x')
Lorenz

Ви можете зробити так, df.columns = df.columns.astype(str) + '_x' як показує мій перший метод.
cs95

4

Я не бачив цього рішення, запропонованого вище, тому додаю це до списку:

df.columns += '_x'

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


Найкраще рішення для суфікса, хоча його, звичайно, не можна використовувати для префікса.
Лоренц,

Працює лише зі звичайними типами даних в іменах стовпців, не якщо ваші стовпці є RangeIndex, як, наприклад, df = pd.DataFrame([[1,2,3]]*10)-> df.columns, тоді ви б використовувалиdf.add_suffix('_x')
Lorenz

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

У майбутніх версіях панд 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.