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

1

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

У меня есть несколько фреймов данных, в которых все есть столбец с именем "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
  • 0
    дайте мне знать, если мне нужно включить что-нибудь еще для MCVE
  • 0
    Как насчет return data.rename(...) внутри функции rename а затем df = rename(df) ?
Показать ещё 1 комментарий
Теги:
pandas
dataframe
user-defined-functions

3 ответа

2
Лучший ответ

Следует отметить несколько замечаний:

  • Вы должны использовать 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
    Я согласен, что это довольно тривиально, я мог бы сделать это более простым способом, я только начинаю понимать, как использовать пользовательские функции, поэтому подумал, что это хорошая вещь, чтобы попробовать
  • 1
    @ LukaVlaskalic, нет проблем, я так и думал, поэтому я решил дать несколько дополнительных указателей :)
Показать ещё 7 комментариев
2

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

0

Вам не нужно повторно назначать фрейм после вызова функции 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
    на самом деле, использование на месте очень часто [не рекомендуется] ( stackoverflow.com/questions/45570984/… ). Между прочим, лучшим решением было бы не создавать новую функцию и просто использовать data = data.rename(Index=str, columns={'interval_time': 'Timestamp'}) . В любом случае этот подход и ваша функция не подходят для конвейеров.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню