我很想知道如何在函数式编程范式中重写以下函数foo
。我不知道如何将filter_df()
应用于kwargs中的列并存储输出,而不改变原始DataFrame对象df
的值。
def foo(df, **kwargs):
for column, values in kwargs.items():
df = filter_df(df, column, values)
return df
def filter_df(df, column, values):
return df.loc[df[column].isin(values)].reset_index(drop=True)
对我来说,一个明显的解决方案可能是为filter_df
的输出分配一个新的变量df_new
,例如
def foo(df, **kwargs):
for column, values in kwargs.items():
df_new = filter_df(df, column, values)
return df_new
然而,这不是特别有效的内存,因为df
可能相当大。此外,我不确定这个选项是否会被归类为纯功能,因为df_new
在每个循环迭代中都会受到影响。
我不太清楚你说的
是什么意思用函数式编程范式重写以下函数
foo
和
然而,这不是特别有效的内存,因为df可能非常大。此外,我不确定这个选项是否会被归类为纯函数,因为df_new在每个循环迭代中都会受到影响。
请注意,foo
的第二个定义不会产生与第一种情况相同的输出,它只返回符合最后一个条件的行,而忽略其余条件。
在每次迭代中,filter_df
产生一个新对象(DataFrame的行满足df[column].isin(values)
),因为reset_index
不原地行动。df_new
在每次循环迭代中都不受影响,名称df_new
只是在每次迭代中重新绑定(即指向)一个新对象。两个条件分别应用,只返回最后一个条件产生的DataFrame。
解决方案/strong>在这种特殊情况下,foo
可以简化为DataFrame.query
。这样就不会创建不必要的中间dataframe。
def foo(df, **kwargs):
query = ' and '.join(f'{col} in {vals}' for col, vals in kwargs.items())
return df.query(query)