2

我有一个带有参数的函数(在这种情况下:“部门”)从我的数据集中过滤(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
4

3 回答 3

3

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

一旦你这样做了,你就可以像这样传递“Take All”参数:

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

wheredf['A'].unique()是此列中所有唯一参数的列表,因此它将返回 all True

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

df['A'].isin(['department', 'string_2', 'string_3']))
于 2019-07-11T09:06:54.573 回答
1

我不认为你可以通过像在 SQL 查询中那样传递参数来做到这一点。您必须稍微重写您的函数才能考虑到这种情况。

于 2019-07-11T09:03:41.403 回答
1

建立在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

我意识到这里缺少部分,因为它们也在最初的问题中,但是这种更改应该可以工作,而无需更改您现在调用函数的方式,但将包括上一个答案中列出的好处。

于 2019-07-11T10:05:57.523 回答