我一直在使用 pandas.pivot_table 通过为 aggfunc 参数提供函数列表(例如 [np.mean, np.std]
)来聚合我的数据帧。现在我想包装这些函数,以便它们仅在提供的列的前半部分上运行,执行如下操作:
new_df = pd.pivot_table(df, values=feature_cols, index=id_cols, aggfunc=[lambda x: np.mean(x[:len(x)//2]), lambda y: np.std(y[:len(y)//2])])
这会抛出错误:
pandas.core.indexes.base.InvalidIndexError: Reindexing only valid with uniquely valued Index objects
但是,new_df = pd.pivot_table(df,values=feature_cols,index=id_cols,aggfunc=[np.mean,np.std])
工作得很好。
我相信我可能误解了pivot_table
如何将类似数组传递给聚合函数或lambda一般如何工作。
想要解决这个问题或者了解在 python 中包装函数的更好方法。我不想为我需要使用的列表中的每个函数都使用 def
定义的函数。
最佳答案
根据doc of pivot_table :当您提供要聚合的函数列表时,列将分层,顶层是函数名称(从函数对象本身推断)。对于两个 lambda 函数,两个名称将相同。这就是你的问题的根源。
好吧,我可以使用 def
为函数命名。但如果您确实想使用 lambda ,也许可以使用 groupby 和 agg 来代替:
new_df = df.groupby(id_col).agg([('half-mean',lambda x:np.mean(x[:len(x)//2])),('half-std',lambda x:np.std(x[:len(x)//2]))])
关于python - 向pandas的pivot_table方法提供lambda函数列表时出现"Reindexing only valid with uniquely valued Index objects"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55387966/