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语句呢?
答案 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
长度的字符串,但如果有任何东西甚至稍微复杂一些,我们就必须探索其他选项。)