У меня есть два кадра данных, и я хочу объединить их внутри функции.
df = pd.DataFrame(data = {'col1': [1, 2], 'A': ['A', 'A']})
df_temp = pd.DataFrame(data = {'col1': [1, 2], 'B': ['B', 'B']})
def func(df):
dx = df.merge(df_temp, how='left', left_on='col1', right_on='col1')
return dx
df.pipe(func)
print(df)
Результат:
pd.DataFrame(data = {'col1': [1, 2], 'A': ['A', 'A']})
В результате я получаю тот же оригинальный df. Столбец B из df_temp не добавляется в фрейм данных df, как я ожидаю. Почему это не работает?
Почему у вас есть функция, которая выполняет одну фиксированную строку кода?
Ну, это был ответ Switfly :)
Это работает, однако большинство моих вызовов функций выглядят так: df.pipe(funct1), df.pipe(func2),..., df.pipe(func17)
. Все они так легко работают, почему функция выше не работает? Есть ли способ изменить его, чтобы я мог называть его просто df.pipe(func)
, а не df = df.pipe(func)
?
Нет, вам нужно будет вернуть значение какому-то имени в глобальном пространстве имен.
Вы забыли присвоить df результату применения функции конвейера (func).
OLD: df.pipe(func)
NEW: df=df.pipe(func)
Согласно документации по каналу, способ использования канала таков>>> df.pipe(h).pipe(g, arg1=a).pipe(f, arg2=b, arg3=c) ...
Я делаю это со многими другими функциями, но эта не работает так. Почему вышеуказанная функция отличается и ее нужно вызывать как df=df.pipe(func)
вместо df.pipe(func)
Функция pipe не изменяет значение df, если вы не присвоите результат df. Это как 3 + 1, но вы все еще печатаете 3.
Если pipe не изменяет df, то мы должны делать df = df.pipe(h).pipe(g, arg1=a).pipe(f, arg2=b, arg3=c)
вместо df.pipe(h).pipe(g, arg1=a).pipe(f, arg2=b, arg3=c)
? Последний был взят из pandas.pydata.org/pandas-docs/stable/reference/api/…
Да, нам следует.
@roganjosh Я знаю, что могу легко сделать это вне функции и без использования канала, но это небольшая часть более крупного скрипта, и, к сожалению, он уже настроен для использования функций и канала. Любая помощь будет оценена по достоинству.