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