Python:功能默认输入代表一切

时间:2016-01-26 18:47:09

标签: python pandas

python中是否有一个变量代表一切?

我有一个名为filter的函数:

def filter(df, col1 = ?, col2 = ?, col3 = ?):
     return df.loc[(df.col1 == col1) & (df.col2 == col2) & (df.col3 = col3),:]

应该怎么做?是

=====================

期望的输出:

如果代码是filter(df),则程序返回整个数据帧。

如果代码是filter(df,col1 ='N'),则程序返回子数据帧,其中col1 ='N'中的值。 (忽略col2和col3的约束)

如果代码是filter(df,col1 ='N',col3 ='S'),则程序返回子数据帧,其中col1 ='N'和col3 ='S'中的值。 (忽略col2的约束)

=====================

有没有简单的方法来代替多个if语句呢?

2 个答案:

答案 0 :(得分:2)

可能有更优雅的方式,但在我的头顶,你可以使用类似的东西:

def my_filter(df, **kwargs):
    for column in kwargs:
        filter_value = kwargs[column]
        df = df.loc[df[column] == filter_value, ]
    return df

filtered_df = my_filter(df, col1='N', col2='S')

答案 1 :(得分:1)

根据您在这些列中的数据类型,您可以执行以下操作:

def filter(df, col1s='', col2s='', col3s=''):
     return df.loc[df.col1.str.contains(col1s) & df.col2.str.contains(col2s) & df.col3.str.contains(col3s)]

从空字符串的默认arg开始,当传递给.str.contains()时会返回任何内容,您不会对那些未提供的列进行过滤。

这当然假设使用str.contains()会从==的数据中返回相同的样本。 (猜测你的'N', 'S'长度为CREATE PROCEDURE mark_test @ErrorMessage NVARCHAR(1000) OUTPUT, @RC INT OUTPUT AS BEGIN BEGIN TRY BEGIN TRANSACTION UPDATE UserTest SET A = 99 WHERE B = 98; IF (@@ROWCOUNT != 1) THROW 50001,'UserTest - Problem setting A',1 UPDATE UserTest SET B = 99 WHERE C = 98; IF (@@ROWCOUNT != 1) THROW 50002,'UserTest - Problem setting B',1 SET @RC = 0 COMMIT TRANSACTION RETURN END TRY BEGIN CATCH SET @RC = 1 SET @ErrorMessage = ERROR_MESSAGE() ROLLBACK TRANSACTION RETURN END CATCH END 长度的字符串,但如果有任何东西甚至稍微复杂一些,我们就必须探索其他选项。)