#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
Это должно выполняться динамически. Мой план таков:
- Используйте регулярное выражение для поиска цифр в СЕРЕДИНЕ строки.
- Замените
_{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. какой из них? лямбда или определенная функция? пример кода, которым вы поделились?