在 Python Pandas 中聚合组并从某个计数中吐出百分比

Posted

技术标签:

【中文标题】在 Python Pandas 中聚合组并从某个计数中吐出百分比【英文标题】:Aggregate groups in Python Pandas and spit out percentage from a certain count 【发布时间】:2015-12-10 13:50:24 【问题描述】:

我试图通过在新列上创建百分比和总和来弄清楚如何在 Pandas 数据框中聚合组。

例如,在下面的数据框中,我有 A、B、C 和 D 列。我想按 A 中的组进行聚合,C 应该是(“1”的频率除以频率的百分比非缺失值),D 应该是非缺失值的总和。

例如,对于 'foo' 组,结果数据框应该是

A    B    C        D
foo       1.333    4

我可以在这里和那里做一些单独的部分,但不确定如何在一个连贯的脚本中编译:

import pandas
from pandas import DataFrame
import numpy as np


df = DataFrame('A' : ['foo', 'foo', 'foo', 'foo',
                        'bar', 'bar', 'bar', 'bar'],
                 'B' : ['one', 'one', 'two', 'three',
                        'two', 'two', 'one', 'three'],
                 'C' : [1, np.NaN, 1, 2, np.NaN, 1, 1, 2], 'D' : [2, '', 1, 1, '', 2, 2, 1])

print df

#df.C.fillna(999, inplace=True)
df.D.replace('', np.NaN, inplace=True)

print df

grouped = df.groupby('A')

#print grouped.last()
#print grouped.sum()
#print grouped.mean()
#print grouped.count()

grouped_aggre = grouped.aggregate(np.sum)

print grouped_aggre
print df.D.mean()
print df.C.mean()

print '//////////////////'
print df.C.count()
print df.C.value_counts(dropna=True)

另外,如何通过上述 C 和 D 列汇总统计按 A 和 B 列进行汇总?

原始数据框:

     A      B   C   D
0  foo    one   1   2
1  foo    one NaN NaN
2  foo    two   1   1
3  foo  three   2   1
4  bar    two NaN NaN
5  bar    two   1   2
6  bar    one   1   2
7  bar  three   2   1

预期结果:

A    B    C        D
foo       1.333    4
bar       1.333    5

【问题讨论】:

您能否针对给定的输入明确显示您的预期输出? 【参考方案1】:

您可以使用groupby/agg 进行求和和计数:

result = df.groupby(['A']).agg('C': lambda x: x.sum()/x.count(), 'D':'sum')

import numpy as np
import pandas as pd

df = pd.DataFrame(
    'A' : ['foo', 'foo', 'foo', 'foo',
            'bar', 'bar', 'bar', 'bar'],
     'B' : ['one', 'one', 'two', 'three',
            'two', 'two', 'one', 'three'],
     'C' : [1, np.NaN, 1, 2, np.NaN, 1, 1, 2], 
     'D' : [2, '', 1, 1, '', 2, 2, 1])
df['D'].replace('', np.NaN, inplace=True)

result = df.groupby(['A']).agg('C': lambda x: x.sum()/x.count(), 'D':'sum')
print(result)

产量

            C  D
A               
bar  1.333333  5
foo  1.333333  4

【讨论】:

哇,一切都在一条线上,太棒了!是否有任何参考文档或章节可供我阅读以了解更多信息?谢谢。 目前在 C 中,它取平均值,有没有办法取 '1' 的百分比来代替?例如对于新的聚合列 C,我应该为 'foo' 获得 2/3,为 'bar' 获得 2/3。因为每组中的三个非缺失值中有两个“1”。 搞定了:result = df.groupby(['A']).agg('C': lambda x: ((x==1).sum())/float (x.count())) 太棒了;很高兴你知道了!

以上是关于在 Python Pandas 中聚合组并从某个计数中吐出百分比的主要内容,如果未能解决你的问题,请参考以下文章

python--pandas分组聚合

按字段 1 聚合组并计算字段 2 的总和

使用 Pandas 数据框聚合后无法对值进行排序

在 Python/Pandas 中执行不同操作的多列有条件地聚合分组数据

遍历 pandas 数据框中的行并匹配列表中的元组并创建一个新的 df 列

Python pandas 计算子字符串的唯一字符串源的数量