Python 2.7 聚合Python中的组,并从某个计数中吐出百分比

Python 2.7 聚合Python中的组,并从某个计数中吐出百分比,python-2.7,numpy,pandas,aggregate-functions,Python 2.7,Numpy,Pandas,Aggregate Functions,我试图通过在新列上创建一个百分比和总和,来找出如何在Pandas数据框中聚合组 例如,在下面的数据框中,我有A、B、C和D列。我希望按A中的组进行聚合,C应为的百分比(“1”的频率除以非缺失值的频率),D应为非缺失值的总和 例如,对于“foo”组,结果数据帧应为 A B C D foo 1.333 4 我能够在这里和那里完成一些单独的片段,但不确定如何在一个连贯的脚本中编译: import pandas from pandas import Data

我试图通过在新列上创建一个百分比和总和,来找出如何在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
您可以使用执行求和和和计数:

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

屈服

            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())})很棒;很高兴你明白了!
            C  D
A               
bar  1.333333  5
foo  1.333333  4