熊猫:按多列分组的价值计数

时间:2018-08-31 17:56:06

标签: python pandas dataframe

我有一个熊猫数据框,我将其分为两列:ID和Item。然后,我将每个组中的最后5次出现(最大),最后想计算一种特定类型的出现次数的比率。具体来说,我想计算每个ID-的“ U”计数项目除以总发生次数。

我在最后一步遇到了麻烦-我不确定如何从下面的常规值计数中得出每个ID-Item分组的比率。任何提示将不胜感激-谢谢!

d={'ID':[1,1,1,1,1,2,2,2,2,2],'Item': ['box','box','ball','ball','box','box','box','ball','box','ball'],'Direction':['D','U','U','D','U','U','D','D','D','D']}
df=pd.DataFrame(data=d)

z=company_item['revision_arrow'].value_counts()

groups=df.groupby(['ID','Item'])
max_count=5
lastfive=groups.head(max_count).reset_index(drop=True)

#count_series=lastfive['Direction'].value_counts()
count_series=groups['Direction'].value_counts()

2 个答案:

答案 0 :(得分:3)

使用value_counts时,可以选择标准化结果。您可以使用此参数,然后索引结果的DataFrame仅包括U行:

out = (df.groupby(['ID', 'Item'])
          .Direction.value_counts(normalize=True)
          .rename('ratio').reset_index())

out.loc[out.Direction.eq('U')]

   ID  Item Direction     ratio
1   1  ball         U  0.500000
2   1   box         U  0.666667
6   2   box         U  0.333333

答案 1 :(得分:0)

如果您只希望为每个ID组计算仅划分为count('U')的count('U'),则可以将apply与定义的函数一起使用:

d={'ID':[1,1,1,1,1,2,2,2,2,2],'Item': ['box','box','ball','ball','box','box','box','ball','box','ball'],'Direction':['D','U','U','D','U','U','D','D','D','D']}
df=pd.DataFrame(data=d)


def func(df):
    return len(df[df.Direction == 'U'])

df.groupby('ID').apply(func) / len(df[df.Direction == 'U'])

输出:

ID
1    0.75
2    0.25

如果需要,可以按ID和项目分组。