我试图通过平均值、中位数、第 25 个百分位数、第 75 个百分位数、标准差来描述 A、B 列。

df = pd.DataFrame({'A':[1,9,3,4,6,8,2,7],
                   'B':[2,4,7,8,9,2,5,6],
                   'S':['L','L','L','S','L','S','S','L']})

这是我所做的并且它有效,因为我只有 25%:
df.pivot_table(columns = ['S'], values = ['A','B'], aggfunc = [np.mean, lambda x: np.percentile(x,25), np.median, np.std])

但是,如果我还输入了第 75 个百分位数,则会显示错误消息:
Reindexing only valid with uniquely valued Index objects

理想情况下,我希望输出列出下一列中的第 75 个百分位数。

最佳答案

这将做我认为你想要的,但没有 lambda 和几行额外的行:

def my25(g):
    return np.percentile(g, 25)

def my75(g):
    return np.percentile(g, 75)

df.pivot_table(columns = ['S'], values = ['A','B'],
               aggfunc = [np.mean, my25, np.median, np.std, my75])

        mean      my25    median         std      my75
S    L     S    L    S      L  S     L     S    L    S
A  5.2  4.67    3  3.0      6  4  3.19  3.06    7  6.0
B  5.6  5.00    4  3.5      6  5  2.70  3.00    7  6.5

编辑:实际上,如果您使用 groupby 而不是 pivot_table 进行聚合,则可以仅使用 lambda 函数,并为每个函数提供一个名称。
func_lst = [('mean',np.mean), ('25',lambda x:np.percentile(x,0.25)),
            ('med',np.median), ('std',np.std), ('75',lambda x:np.percentile(x,0.75))]

df.groupby('S').agg(func_lst).stack(level=0).unstack(level=0).swaplevel(0,1,axis=1)
        mean      25    med         std      75
S    L     S  L    S   L  S     L     S  L    S
A  5.2  4.67  3  3.0   6  4  3.19  3.06  7  6.0
B  5.6  5.00  4  3.5   6  5  2.70  3.00  7  6.5

我认为在 pivot_table 调用中使用 func_lst 可能会起作用,但它不起作用。无论如何,对我来说,定义 my25、my75 函数并使用 pivot_table 会更清楚。

关于python - Pandas pivot_table 百分位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34260003/

10-12 21:48