如何解决在 Pandas 数据透视表中,如何为数据子集定义函数?
我正在使用与此类似的数据框:
姓名 | 指标 1 | 指标 2 | 国家 |
---|---|---|---|
约翰 | 0.10 | 5.00 | 加拿大 |
简 | 0.50 | 加拿大 | |
杰克 | 2.00 | 加拿大 | |
波莉 | 0.30 | 加拿大 | |
迈克 | 加拿大 | ||
史蒂夫 | 加拿大 | ||
百合 | 0.15 | 1.20 | 加拿大 |
凯特 | 3.00 | 加拿大 | |
爱德华 | 0.05 | 加拿大 | |
皮特 | 0.02 | 0.03 | 加拿大 |
我正在尝试定义一个函数,该函数将计算大于 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})
我得到的结果是:
国家 | 指标 1 | 指标 2 | 姓名 |
---|---|---|---|
加拿大 | 0.2 | 0.2 | 10 |
因此该函数返回所有大于 1 的行的百分比。有关如何解决此问题的任何想法?
解决方法
x!=0
返回一个布尔数组,因此 len()
不计算 True 的数量。
试试
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。