Как сохранить новый фрейм данных после использования на нем собственной функции?
Я только начинаю использовать пользовательские функции, так что это, наверное, не очень сложный вопрос, простите меня.
У меня есть несколько фреймов данных, у всех из которых есть столбец с именем 'interval_time' (например), и я хотел бы переименовать этот столбец в 'Timestamp'.
Я знаю, что я могу сделать это вручную с этим;
df = df.rename(index=str, columns={'interval_time': 'Timestamp'})
но теперь я хотел бы определить функцию с именем rename, которая делает это для меня. Я видел, что это работает;
def rename(data):
print(data.rename(index=str, columns={'interval_time': 'Timestamp'}))
но я не могу понять, как сохранить переименованный фрейм данных, я попробовал это;
def rename(data):
data = data.rename(index=str, columns={'interval_time': 'Timestamp'})
Фреймы данных, которые я использую, имеют следующую форму;
df_scada
interval_time A ... X Y
0 2010-11-01 00:00:00 0.0 ... 396.36710 381.68860
1 2010-11-01 00:05:00 0.0 ... 392.97974 381.40634
2 2010-11-01 00:10:00 0.0 ... 390.15695 379.99493
3 2010-11-01 00:15:00 0.0 ... 389.02786 379.14810
3 ответа
Есть несколько моментов, на которые следует обратить внимание:
- Вам нужно использовать
return
в вашей функции. - Хорошей практикой является сделать такие функции общими. Например, ваши имена входных и выходных столбцов могут быть аргументами с установленными значениями по умолчанию.
- Предложения панд
pd.DataFrame.pipe
для облегчения цепочки методов. - Вы не должны называть свою функцию так же, как метод Pandas. Это приведет только к путанице.
Соединение этих элементов:
def rename_col(data, col_in='interval_time', col_out='Timestamp'):
return data.rename(index=str, columns={col_in: col_out})
df = df.pipe(rename_col)
Это тривиальный пример, который, вероятно, не требует определенной пользователем функции. Однако приведенный выше совет может помочь при написании более сложных функций.
Без inplace=True функция создает новый объект, который необходимо вернуть:
import pandas as pd
def rename(data):
return data.rename(index=str, columns={'interval_time': 'Timestamp'})
data = pd.DataFrame([1,2,3,4], columns=['interval_time'])
renamed_data = rename(data)
Если не нужно создавать новый DF, установите inplace=True в функцию.
Вам не нужно повторно назначать фрейм данных после вызова rename
функция, потому что pandas.DataFrame
является изменяемым объектом и поэтому передается по ссылке. Посмотрите по этой ссылке, как проходят объекты Python
https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/
Кроме того, вы должны использовать inplace
свойство, чтобы вы не создали новый объект внутри функции. Ваш код в функции переименования будет выглядеть так
def rename(data):
data.rename(index=str, columns={'interval_time': 'Timestamp'}, inplace=True)
После звонка rename(df)
ваш DataFrame df
колонки переименованы.