Как сохранить новый фрейм данных после использования собственной функции на нем? - PullRequest
0 голосов
/ 06 июля 2018

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

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

0 голосов
/ 06 июля 2018

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

0 голосов
/ 06 июля 2018

Следует отметить несколько моментов:

  • Вам нужно использовать return в своей функции.
  • Хорошей практикой является сделать такие функции общими. Например, ваши имена входных и выходных столбцов могут быть аргументами с установленными значениями по умолчанию.
  • Pandas предлагает 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)

Это тривиальный пример, который, вероятно, не требует пользовательской функции. Однако приведенный выше совет может помочь при написании более сложных функций.

0 голосов
/ 06 июля 2018

Без 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 в функцию.

...