如何在 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
我知道这里有遗漏的部分,因为它们也在最初的问题中,但这种变化应该可以工作,而不必改变你现在调用你的函数的方式,但会包括上一个答案中列出的好处。
我有一个带有参数(在本例中为:"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
我知道这里有遗漏的部分,因为它们也在最初的问题中,但这种变化应该可以工作,而不必改变你现在调用你的函数的方式,但会包括上一个答案中列出的好处。