python - 向pandas的pivot_table方法提供lambda函数列表时出现"Reindexing only valid with uniquely valued Index objects"错误?

标签 python pandas lambda

我一直在使用 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/

相关文章:

python - 我如何通过在 python 中使用 re.sub 将 "11 12 13 14"转换为 "12 13 14 15"

python - 使用Python从excel文件中写出没有时间的日期

python - 为列中的每个因子级别创建新的数据框

java - 展平集合中的集合以获得单个 List<>

Java泛型推理太宽泛?

c++ - lambda 表达式被拒绝 (C++11)

python - 如何获得学期平均分

python - 为什么 SciPy 返回 `nan` 用于样本方差为 0 的 t 检验?

python - 使用类对象从外部文件创建 sqlite 数据库

python - 迭代列的条件以查找其他列值