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

Я только начинаю использовать пользовательские функции, так что это, наверное, не очень сложный вопрос, простите меня.

У меня есть несколько фреймов данных, у всех из которых есть столбец с именем '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 колонки переименованы.

Другие вопросы по тегам