Я только начинаю использовать пользовательские функции, поэтому это, вероятно, не очень сложный вопрос, простите меня.
У меня есть несколько фреймов данных, в которых все есть столбец с именем "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
Следует отметить несколько замечаний:
return
в своей функции.pd.DataFrame.pipe
для облегчения цепочки методов.Объединяя эти элементы:
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
переименовал свои столбцы.
data = data.rename(Index=str, columns={'interval_time': 'Timestamp'})
. В любом случае этот подход и ваша функция не подходят для конвейеров.
return data.rename(...)
внутри функцииrename
а затемdf = rename(df)
?