Python 熊猫:多列groupby的值计数

Python 熊猫:多列groupby的值计数,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据框架,我通过两列对其进行分组:ID和Item。然后,我将保留每组中最后5次出现(最多),并最终计算一种特定类型出现次数的比率。具体而言,我将计算每个ID项的“U”计数除以出现总数 最后一步我遇到了麻烦-我不知道如何从下面的常规值计数中获得每个ID项分组的比率。任何提示都将不胜感激-谢谢 d={'ID':[1,1,1,1,1,2,2,2,2,2],'Item': ['box','box','ball','ball','box','box','box','ball','box','b

我有一个熊猫数据框架,我通过两列对其进行分组:ID和Item。然后,我将保留每组中最后5次出现(最多),并最终计算一种特定类型出现次数的比率。具体而言,我将计算每个ID项的“U”计数除以出现总数

最后一步我遇到了麻烦-我不知道如何从下面的常规值计数中获得每个ID项分组的比率。任何提示都将不胜感激-谢谢

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()
使用时,您可以选择规范化结果。您可以使用此参数,然后索引生成的数据帧,使其仅包含
U
行:

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

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

使用时,您可以选择规范化结果。您可以使用此参数,然后索引生成的数据帧,使其仅包含
U
行:

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

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


如果要为划分为所有计数('U')的每个ID组仅计算计数('U'),可以将应用与定义的函数一起使用:

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和项目进行分组。

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

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和项目进行分组。

我相信这个问题的第一个答案是相关的:。在groupby对象上使用
.size().unstack(fill_value=0)
。这将获得每个ID项的“U”出现次数,然后可以除以出现次数的总数。我相信这个问题的第一个答案是相关的:。在groupby对象上使用
.size().unstack(fill_value=0)
。这将获得每个ID项的“U”出现次数,然后您可以除以出现次数的总数。谢谢。这在示例代码中非常有效,但由于某种原因,如果我尝试在实际数据中执行此操作,我会出现此错误:AttributeError:'DataFrameGroupBy'对象没有属性'Direction'@Z_D您的实际数据帧是否有一个名为
Direction
的列?真是太蠢了!不,没有,谢谢。现在修好了。这是一个非常好的解决方案-感谢您向我介绍此功能。当我在虚拟数据和真实数据之间切换时,我总是遇到这种情况:)很乐意帮忙!谢谢这在示例代码中非常有效,但由于某种原因,如果我尝试在实际数据中执行此操作,我会出现此错误:AttributeError:'DataFrameGroupBy'对象没有属性'Direction'@Z_D您的实际数据帧是否有一个名为
Direction
的列?真是太蠢了!不,没有,谢谢。现在修好了。这是一个非常好的解决方案-感谢您向我介绍此功能。当我在虚拟数据和真实数据之间切换时,我总是遇到这种情况:)很乐意帮忙!