Присваивание фрейму данных внутри цикла for - PullRequest
0 голосов
/ 10 июля 2020

Я хочу написать функцию, которая принимает фрейм данных и удаляет некоторые из его строк:

import pandas as pd

a = pd.DataFrame([1,2,3,3,5])

def f(df):
    df = df[(df > 2)]
    print(df)

f(a)
print(a)

Это выводит

   0
2  3
3  3
4  5

   0
0  1
1  2
2  3
3  3
4  5

Итак, a здесь не обновлялся. Это потому, что df внутри тела функции на самом деле является копией a? Если да, как я могу переписать код, чтобы получить доступ к подлинному фрейму данных внутри функции? В более общем плане я хотел бы сделать с фреймами данных в функциях и другие вещи, которые требуют обновления объектов, переданных в качестве входных данных функции, поэтому есть ли общее решение для этого?

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы также можете изменить глобальную переменную a:

import pandas as pd

a = pd.DataFrame([1,2,3,3,5])

def f(df_name):
    globals()[df_name] = eval(f"{df_name}[({df_name} > 2)]")
    print(globals()[df_name])
f("a")

Теперь фрейм данных с именем «a» будет изменен. Обратите внимание, что аргументом функции является строка "a", а не сама переменная a. Это работает, но не рекомендуется, потому что в коде есть globals и eval (подробнее почему: Почему глобальное состояние такое злое? )

Простой способ:

def f(df):
    return df[(df > 2)]

a = f(a)

Функция возвращает только что измененный фрейм данных.

0 голосов
/ 10 июля 2020

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

Как фильтровать на месте.

Так что в вашем случае это будет (я думаю):

import pandas as pd

a = pd.DataFrame([1,2,3,3,5])

def f(df):
    # df = df[(df > 2)]
    df.drop(df[(df > 2)], inplace = True) # might need df[(df>2)].index
    print(df)

f(a)
print(a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...