Переименовать столбец в фрейме данных, который содержит цифры в середине

#python #pandas #dataframe #rename

#python #панды #фрейм данных #переименовать

Вопрос:

Скажем, у меня есть столбцы фрейма данных как таковые df.info() :

  #   Column                       Non-Null Count  Dtype 
---  ------                       --------------  ----- 
 0   Action_3.@source             1 non-null      object
 1   Description_3.#text          1 non-null      object
 2   Code_3.@source               1 non-null      object
 3   Others                       1 non-null      object
 4   Animal_1                     1 non-null      object
  

Для:

  #   Column                       Non-Null Count  Dtype 
---  ------                       --------------  ----- 
 0   Action.@source_3             1 non-null      object
 1   Description.#text_3          1 non-null      object
 2   Code.@source_3               1 non-null      object
 3   Others                       1 non-null      object
 4   Animal_1                     1 non-null      object
  

Это должно выполняться динамически. Мой план таков:

  1. Используйте регулярное выражение для поиска цифр в СЕРЕДИНЕ строки.
  2. Замените _{digit} на конец имени столбца, итеративно.

Мой текущий код :

 def check_number_in_column(column_name):

    return any(i.isdigit() for i in column_name)


# List out the column names then loop
temp_column_name = temp_df.columns

for j, name in enumerate(temp_column_name):            

    if check_number_in_column(name) is True :
    #TODO
  

Ответ №1:

Вы могли бы использовать регулярное выражение с pandas’str.replace для его динамического изменения :

 df = pd.DataFrame(
    [],
    columns=[
        "Action_3.@source",
        "Description_3.#text",
        "Code_3.@source",
        "Others",
        "Animal_1",
    ],
)

pat = r"(?P<first>. )(?P<middle>_d)(?P<last>. )"
repl = lambda m: f"{m.group('first')}{m.group('last')}{m.group('middle')}"

df.columns.str.replace(pat, repl)

Index(['Action.@source_3', 'Description.#text_3', 'Code.@source_3', 'Others',
       'Animal_1'],
      dtype='object')
  

Вы также можете определить функцию, если хотите избежать лямбда :

 def repl(m):
    return f"{m.group('first')}{m.group('last')}{m.group('middle')}"
  

Применить функцию :

 df.columns.str.replace(pat, repl=repl)
  

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

1. любой способ избежать лямбда?

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

3. какой из них? лямбда или определенная функция? пример кода, которым вы поделились?