Python 如何使用pandas groupby基于不同列获取唯一计数

Python 如何使用pandas groupby基于不同列获取唯一计数,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有以下数据帧: df = pd.DataFrame({ 'user': ['user122', 'user122', 'user124', 'user125', 'user125', 'user126', 'user126'], 'effortduration' : ['2 weeks', np.nan, '2 weeks', '3 weeks', np.nan, '2 weeks', '2 weeks'], 'callbacks' : [0, 0, 0, 0, 0,

我有以下数据帧:

df = pd.DataFrame({
    'user': ['user122', 'user122', 'user124', 'user125', 'user125', 'user126', 'user126'],
    'effortduration' : ['2 weeks', np.nan, '2 weeks', '3 weeks', np.nan, '2 weeks', '2 weeks'],
    'callbacks' : [0, 0, 0, 0, 0, 1, 1],
    'applications': [0, 0, 1, 0, 0, 1, 1]})
df

  user     effortduration  callbacks  applications
user122        2 weeks          0             0
user122            NaN          0             0
user124        2 weeks          0             1
user125        3 weeks          0             0
user125            NaN          0             0
user126        2 weeks          1             1
user126        2 weeks          1             1
我想按effortduration分组,并根据用户列的唯一计数获取每个列的计数。 这就是我迄今为止所尝试的:

function = {"user": pd.Series.nunique,
            "callbacks": lambda x: x.nunique(),
            "applications": lambda x: x.isin(['1']).nunique(),}

df.groupby('effortduration').agg(function)

                  user  callbacks  applications
effortduration                               
2 weeks            3          2             2
3 weeks            1          1             1
但是,这也不是我想要的,因为回调应用程序的值不是基于用户列。我的结果应该是这样的:

                   user  callbacks  applications
effortduration                               
2 weeks            3          1             2
3 weeks            1          0             0
有没有办法做这样的事?如果是,是否也可以对其进行推广,因为我的原始数据帧有更多的列,手工编写所有函数会很痛苦?

  • 这适用于样本数据,我不确定是否适用于真实数据
  • 将0替换为
    NaN
    ,如果
    'effortduration'
    'callbacks'
    'applications'
    都是
    NaN
    ,则删除
    NaN
  • 删除所有重复项
    • 根据期望的结果,只有用户调用/应用一次才重要
  • 分组计数
将熊猫作为pd导入
#样本数据
df=pd.DataFrame({'user':['user122','user122','user124','user125','user125','user126','user126','user126'],'effortduration':['2 weeks',np.nan','2 weeks','3 weeks','np.nan','2 weeks','2 weeks','callbacks':[0,0,0,1,1],'applications':[0,0,1,0,0,1]})
#替换0并删除nan
df=df.replace(0,np.nan).dropna(how='all',subset=['effortduration','callbacks','applications'])
#删除重复项
df=df.drop_duplicates()
#分组计数
dfg=df.groupby(['effortduration']).count()
#dfg
用户回调应用程序
努力持续时间
2周3112
3周100
nunique
  • 如前所述,此选项返回列中唯一值的数量,因此不返回所需的输出
df=pd.DataFrame({'user':['user122','user122','user124','user125','user125','user126','user126'],'effortduration':['2 weeks',np.nan','2 weeks','3 weeks','np.nan','2 weeks','callbacks':[0,0,0,0,1,1],'applications':[0,0,1,1]})
#使用努尼克
dfg=df.groupby('effortduration').nunique()
#dfg
用户回调应用程序
努力持续时间
2周3 2
3周1