如何在 pandas loc 过滤条件中传递一个 "Take All" 参数?

How to pass a "Take All" parameter in pandas loc filter condition?

我有一个带有参数(在本例中为:"department")的函数,用于过滤(df.loc[(df['A'] == department)我的特定数据数据集。在一种情况下,我想使用这个特定的函数,但我不想过滤数据,而是想获取所有数据。

有没有办法传递一个参数,它会导致类似 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

我认为您不能像在 SQL 查询中那样通过传递参数来做到这一点。您必须 re-write 稍微调整一下您的功能才能考虑到这种情况。

我能想到的一种方法是,您可以使用 df['A'].isin(['department']) 而不是 df['A'] == 'department'。两者产生相同的结果。

完成后,您可以像这样传递 "Take All" 参数:

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

其中 df['A'].unique() 是此列中所有唯一参数的列表,因此它将 return 所有 True.

或者您可以像这样传递多个参数:

df['A'].isin(['department', 'string_2', 'string_3']))

构建 ,因为您知道要搜索的列的名称,您可以在函数中添加他的解决方案并相应地处理“*”。

看起来像这样:

# 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

我知道这里有遗漏的部分,因为它们也在最初的问题中,但这种变化应该可以工作,而不必改变你现在调用你的函数的方式,但会包括上一个答案中列出的好处。