首页 > 解决方案 > 按组获取所有行、选定行和熊猫总数的百分比

问题描述

假设我有一个名为 mydf 的 pandas 数据框。IE,

import pandas as pd

mydf = pd.DataFrame({
    'type':['A','A','A', 'B','B','B', 'C'], 
    'state':['NY','CA','NY', 'NY','CA','CA', 'WY'], 
    'date':['2018-01-02','2018-01-04','2018-02-06', 
            '2018-01-01','2018-01-24','2018-02-10','2018-01-24']
})

Out[28]: 
         date state type
0  2018-01-02    NY    A
1  2018-01-04    CA    A
2  2018-02-06    NY    A
3  2018-01-01    NY    B
4  2018-01-24    CA    B
5  2018-02-10    CA    B
6  2018-01-24    WY    C

我想要一个表格,用于计算 A 类型的所有记录、所有记录(A、B、C 类型)的每个州和日期(仅年月而不是每天日期)的记录总数,然后是 A 的百分比每组内计入总数。

即,最终输出将是另一个具有以下列和值的 pandas 数据框:

date_ym state   total_count total_type_A    percentage
20181   CA      2           1               50
20181   NY      2           1               50
20181   WY      1           0               0
20182   CA      1           0               0
20182   NY      1           1               50

我可以创建两个表,然后合并它们然后计数,但我正在寻找一个更简单的单行代码......

标签: pythonpandas

解决方案


第一次转换日期为月份:

mydf["date"] = mydf["date"].dt.strftime("%Y%m")

然后使用groupby.agg

def total_type_A(x):
    return sum(x == "A")

def percentage(x):
    return sum(x == "A") / len(x)

mydf.groupby(["date", "state"]).agg([len, total_type_A,  percentage])

推荐阅读