您能否在 pandas 枢轴 table 中仅删除一个 aggfunc 的重复项?

Can you drop duplicates for only one aggfunc in a pandas pivot table?

我正在 pandas 中构建数据透视表 table,需要对数据应用各种函数。我的问题是,对于某些 aggfunc,我需要将它们应用于整个数据集,而对于其他人,我需要在应用函数之前删除重复项。我的数据框看起来类似于:

我正在使用与此类似的数据框:

Name Metric 1 Metric 2 Country Payment
John 0.10 5.00 Canada 100
John 0.30 1.00 Canada 100
John .40 Canada 100
Jane 0.50 US 30
Jane US 30
Jack UK 50
Jack .70 .2 UK 50
Jack 1.00 UK 50
Jack UK 50
Polly 0.30 Canada 150
Mike Argentina 80
Mike Argentina 80
Steve Canada 20
Lily 0.15 1.20 Mexico 40
Kate 3.00 Australia 90
Edward 0.05 Australia 70
Pete 0.02 0.03 New Zealand 20

这是我的代码:

import pandas as pd
import io
df = pd.read_csv(io.BytesIO(data_to_load['metric data.csv']))

def metricgreaterthanone(x):
    n = pd.to_numeric(x, errors="coerce")
    return (n > 1).sum() / n.notna().sum()

pd.pivot_table(df,index=['Country'],values=["Name","Metric 1","Metric 2","Payment"],aggfunc={'Name':pd.Series.nunique, "Metric 1":metricgreaterthanone,"Metric 2":metricgreaterthanone,"Payment":np.sum},margins=True)

指标 1 和指标 2 对于每一行都是唯一的,并且必须在函数中使用,不能删除任何重复项。然而,重复支付(即,约翰没有收到 300 美元,他的总额只有 100 美元)。如果我按原样 运行 代码,我会在指标 1 和指标 2 上得到我的数据透视表 table 的正确输出,但加拿大的付款总额是 470 美元,而它应该是 270 美元。

如果我将 .drop_duplicates 应用于主元 table,就像这样:

pd.pivot_table(df.drop_duplicates(subset=['Name']),index=['Country'],values=["Name","Metric 1","Metric 2","Payment"],aggfunc={'Name':pd.Series.nunique, "Metric 1":metricgreaterthanone,"Metric 2":metricgreaterthanone,"Payment":np.sum},margins=True)

那么每个国家/地区的付款总和都是正确的,但度量函数不再正确。所以,我的问题是:有没有办法只删除与“付款”列相关的重复项?

感谢您的所有帮助! (如果您还可以解释为什么边距在这里也不起作用,则加分!)

由于您不对付款列执行其他操作,因此您可以 mask(因此替换为 nan)名称列中 duplicated 的值。

pd.pivot_table(df.assign(Payment=lambda x: x['Payment'].mask(x['Name'].duplicated())),
               index=['Country'],values=["Name","Metric 1","Metric 2","Payment"],
               aggfunc={'Name':pd.Series.nunique, "Metric 1":metricgreaterthanone,
                        "Metric 2":metricgreaterthanone,"Payment":np.sum},
               margins=True)

             Metric 1  Metric 2  Name  Payment
Country                                       
Argentina         NaN       NaN     1     80.0
Australia         0.5       NaN     2    160.0
Canada            0.0  0.333333     3    270.0
Mexico            0.0  1.000000     1     40.0
New Zealand       0.0  0.000000     1     20.0
UK                0.0  0.000000     1     50.0
US                0.0       NaN     1     30.0
All               0.0  0.666667     3    160.0

关于 margins 问题,您可以查看