在 pandas 主元 table 中,如何为数据子集定义函数?

In a pandas pivot table, how do I define a function for a subset of data?

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

Name Metric 1 Metric 2 Country
John 0.10 5.00 Canada
Jane 0.50 Canada
Jack 2.00 Canada
Polly 0.30 Canada
Mike Canada
Steve Canada
Lily 0.15 1.20 Canada
Kate 3.00 Canada
Edward 0.05 Canada
Pete 0.02 0.03 Canada

我正在尝试定义一个函数,该函数将计算大于 1 的指标在具有指标 的行中所占的百分比。我希望对于指标 1,我应该得到 25%,对于指标 2,我应该得到 66%。但是,我的函数根据总行数返回结果。这是我的代码:

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

df = df.fillna(0)

def metricgreaterthanone(x):
  return (x>1).sum()/len(x!=0)

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

我得到的结果是:

Country Metric 1 Metric 2 Name
Canada 0.2 0.2 10

所以函数返回所有行中大于 1 的百分比。关于如何解决这个问题有什么想法吗?

x!=0 returns 一个布尔数组,所以 len() 不计算 Trues 的数量。

尝试


def metricgreaterthanone(x):
  return (x>1).sum()/(x!=0).sum()

您似乎有空字符串 "" 而不是数字。你可以试试:

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


x = pd.pivot_table(
    df,
    index=["Country"],
    values=["Name", "Metric 1", "Metric 2"],
    aggfunc={
        "Name": pd.Series.nunique,
        "Metric 1": metricgreaterthanone,
        "Metric 2": metricgreaterthanone,
    },
)
print(x)

打印:

         Metric 1  Metric 2  Name
Country                          
Canada       0.25  0.666667    10