微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Pandas 数据透视表中,如何为数据子集定义函数?

如何解决在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?