Python与Pandas的函数式编程



我很想知道如何在函数式编程范式中重写以下函数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。

<<p>

解决方案/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)

相关内容

  • 没有找到相关文章

最新更新