Как передать параметр «Взять все» в условии фильтра «Панда лок»? - PullRequest
2 голосов
/ 11 июля 2019

У меня есть функция с параметром (в данном случае: «отдел») для фильтрации (df.loc [(df ['A'] == отдел) конкретных данных из моего набора данных. В одном случае я хочуиспользовать эту конкретную функцию, но вместо фильтрации данных, я хочу получить все данные.

Есть ли способ передать параметр, который приведет к что-то вроде df.loc [(df ['A'] == *) или df.loc [(df ['A'] ==%)

    # Write the data to the table 

    def table_creation(table, department, status):

        def condition_to_value(df, kpi):
            performance_indicator = df.loc[(df['A'] == department) & (df['C'] == kpi) & (df['B'] == status), 'D'].values[0]
        return performance_indicator

Ответы [ 3 ]

3 голосов
/ 11 июля 2019

Один из способов, который я могу придумать, это вместо: df['A'] == 'department' вы можете использовать df['A'].isin(['department']). Два дают одинаковый результат.

Как только вы это сделаете, вы можете передать параметр «Взять все» следующим образом:

df['A'].isin(df['A'].unique())

где df['A'].unique() - список всех уникальных параметров в этом столбце, поэтому он вернет все True.

Или вы можете передать несколько параметров, например:

df['A'].isin(['department', 'string_2', 'string_3']))
1 голос
/ 11 июля 2019

Построение поверх Ответ Newskooler , поскольку вы знаете имя столбца, по которому вы будете искать, вы можете добавить его решение в функцию и обработать '*' соответственно.

Это будет выглядеть примерно так:

# Write the data to the table 
def table_creation(table, department, status):
    def condition_to_value(df, kpi):
        # use '*' to identify all departments
        if isinstance(department, str) and department=='*':
            department = df['A'].isin(df['A'].unique()) 
        # make the function work with string or list inputs
        if isinstance(department, str):
            department = [department, ]
        # notice the addition of the isin as recommended by Newskooler
        performance_indicator = df.loc[(df['A'].isin(department)) & (df['C'] == kpi) & (df['B'] == status), 'D'].values[0]
        return performance_indicator

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

1 голос
/ 11 июля 2019

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

...