Альтернатива версии @coldspeed:

аюсь отфильтровать кадр данных панды, используя пороги для трех столбцов

import pandas as pd
df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : [-5, 2, 1, 8, 2]})
df = df.loc[(df.A > 0) & (df.B > 2) & (df.C > -1)].reset_index(drop = True)

df
    A  B  C
0   2  5  2
1  10  3  1
2   3  6  2

Однако я хочу сделать это внутри функции, в которой имена столбцов и их пороговые значения даны мне в словаре. Вот моя первая попытка, которая работает нормально. По сути я помещаю фильтр внутрьcond переменная и просто запустите ее:

df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : [-5, 2, 1, 8, 2]})
limits_dic = {"A" : 0, "B" : 2, "C" : -1}
cond = "df = df.loc["
for key in limits_dic.keys():
    cond += "(df." + key + " > " + str(limits_dic[key])+ ") & "
cond = cond[:-2] + "].reset_index(drop = True)"
exec(cond)
df
    A  B  C
0   2  5  2
1  10  3  1
2   3  6  2

Теперь, наконец, я помещаю все в функцию, и она перестает работать (возможно,exec функция не любит, чтобы ее использовали внутри функции!):

df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : [-5, 2, 1, 8, 2]})
limits_dic = {"A" : 0, "B" : 2, "C" : -1}
def filtering(df, limits_dic):
    cond = "df = df.loc["
    for key in limits_dic.keys():
        cond += "(df." + key + " > " + str(limits_dic[key])+ ") & "
    cond = cond[:-2] + "].reset_index(drop = True)"
    exec(cond)
    return(df)

df = filtering(df, limits_dic)
df
    A  B  C
0   6  2 -5
1   2  5  2
2  10  3  1
3  -5  2  8
4   3  6  2

я знаю этоexec Функция действует по-разному, когда используется внутри функции, но не знала, как решить проблему. Кроме того, мне интересно, что должен быть более элегантный способ определения функции для фильтрации с учетом двух входных данных: 1)df и 2)limits_dic = {"A" : 0, "B" : 2, "C" : -1}, Буду признателен за любые мысли по этому поводу.

Ответы на вопрос(0)

Ваш ответ на вопрос