У меня есть такой фрейм данных:

df=pd.DataFrame(data={'2021-11-21':['10','20'],'2021-11-14':['39','21']})

df
2021-11-21    2021-11-14
10            39
20            21

Я хочу переименовать столбцы следующим образом:

curr_week_2021-11-21    prev_week_2021-11-14
10                      39
20                      21

Я пробовал это:

df_cols=df.columns.to_list()
df=df.rename(columns={'2021-11-21':'curr_week_'+df_cols[0],'2021-11-14':'prev_week_'+df_cols[1]})

Но это не сработало.

0
Clegane 23 Ноя 2021 в 18:07
Работает для меня. Вы уверены, что имена ваших столбцов строковые? Также подойдет df.columns = ['curr_week_', 'prev_week_'] + df.columns.
 – 
Quang Hoang
23 Ноя 2021 в 18:11
У меня ошибка: TypeError: Cannot broadcast np.ndarray with operand of type <class 'list'>
 – 
Clegane
23 Ноя 2021 в 18:22
Вы должны использовать старую версию numpy.
 – 
Quang Hoang
23 Ноя 2021 в 18:40

2 ответа

Лучший ответ

Если вы хотите использовать rename, создайте сопоставление слов:

df = df.rename(columns={c: f"{p}_{str(c)}"
                  for c, p in zip(df.columns, ['curr_week', 'prev_week'])})
print(df)

# Output:
  curr_week_2021-11-21 prev_week_2021-11-14
0                   10                   39
1                   20                   21
1
Corralien 23 Ноя 2021 в 18:22

Один из способов сделать это программно с произвольным списком префиксов - использовать map / zip / join:

prefixes = ['curr_week', 'prev_week']
df.columns = map('_'.join, zip(prefixes, df.columns))

Выход:

  curr_week_2021-11-21 prev_week_2021-11-14
0                   10                   39
1                   20                   21
1
mozway 23 Ноя 2021 в 18:11
TypeError: sequence item 1: expected str instance, datetime.date found. я получаю эту ошибку.
 – 
Clegane
23 Ноя 2021 в 18:20
1
Я вижу, у вас нет струн. Можете ли вы попробовать df.columns = map('_'.join, zip(prefixes, map(str, df.columns)))
 – 
mozway
23 Ноя 2021 в 18:28
Оно работает. Благодарю.
 – 
Clegane
23 Ноя 2021 в 18:36