2017-03-23 53 views
1

我有很少的熊猫df,那些需要一个接一个地处理几个功能。因此,对于经过第一个函数后的某个df,生成的df将需要以相同的方式使用顺序函数进行处理。伪代码可能如下,如何正确使用lambda与pandas df?

df = func_1(df) 
df = func_2(df) 
df = func_3(df) 

和稍后被附加在列表中,如lis.append(df)。随着循环中,代码可能会喜欢下面,

storage = [] 
for df in dfs: 
    for func in functions: 
     df = func(df) 
    storage.append(df) 

df = pd.concat(storage, ignore_index=True) 

最后,我可以用concat产生最终DF。上面的代码是它假设的,我的代码在下面。尽管代码完美运行,但它与我打算的方式不同。

storage = [map(lambda df: f(df) , dfs) for f in functions][-1] 
df = pd.concat(storage, ignore_index=True) 

对于存储,右手侧产生具有元素的列表号等于所述DFS和最后一个元素(-1)恰好是List Of 1 Element过程与DFS与联体一起的所有功能和。以下是区别,前面的storage列表会生成所有带有函数的dfs,元素编号将与dfs相同。

我的问题:我如何才能使用lambda函数来获取存储列表?该列表应包含与dfs相同数量的元素,并且应该使用所有功能进行处理。

如果您有问题,我会尽力更好地解释它,但请在downvote之前咨询。

回答

1

好的,让我们把你的任务分解成几部分。

首先,您想将一系列函数应用于同一个对象。我会坚持这个简单的例子,但想法是一样的。首先,让我们定义一个辅助函数,它接受的功能列表,并将它们应用到对方:

apply_rec = lambda f, d: f[0](d) if len(f) == 1 else apply_rec (f[1:], f[0](d)) 

它接受的功能和初始数据的列表。如果列表只包含一个函数,它将其应用于数据并返回结果;否则,它会从列表中删除第一个函数,并将其应用于数据并使用这些输入调用它自己。

让我们试一下:

data = 10 
fs = [lambda x = x+1, lambda x = x * 2, lambda x = x ** 2] 
>>> apply_rec (fs, data) 
484 

现在,你可以做到以下几点:

storage = [apply_rec (functions, df) for df in dfs] 

我希望理解正确你的问题。

+0

您正确回答问题,实际上,这是一个很好的答案。非常感谢CAPTAIN。 – Arefe