具有多个 groupby 的特定值的唯一列值的数值聚合
Numerical aggregate of unique column value by particular value with multiple groupby
- 考虑一个 pandas 数据框
用户基于 r_no 基于相同值打开的唯一 cam_id 的数值聚合
输出应该像
建议
(我试过 group by 似乎我增加了复杂性我有一百万行)
df = pd.DataFrame()
df['r_no'] = [1,1,1,2,3,1,1,1,2]
df['user'] = ['sam','sam','sam','sam','peter','jack','jack','Kris','peter']
df['value'] = [76,76,7,8,8,2,29,2,8]
df['cam_id'] = ['ab','abc','ab','ab','ab','abcd','abcd','abcd','ab']
df
您可以使用 value_counts
df['value_count'] = df['r_no'].value_counts()
如果我明白你想做什么
这应该可以解决问题:
unique_count = df.loc[df['r_no']==1].groupby(['user','value'])['cam_id']\
.nunique()\
.rename('count_unique')
df = df.join(unique_count, on=['user','value']).fillna(0)
使用:
(df.merge(df[df['r_no.']==1].groupby(['r_no.','user','value'])['cam_id']
.nunique()
.rename('count_unique').reset_index(),
on=['r_no.','user','value'], how='left').fillna(0))
输出:
r_no. user value cam_id count_unique
0 1 sam 76 ab 2.0
1 1 sam 76 abc 2.0
2 1 sam 7 ab 1.0
3 2 sam 8 ab 0.0
4 2 peter 8 ab 0.0
5 1 jack 2 abcd 1.0
6 1 jack 29 abcd 1.0
7 1 kris 2 abcd 1.0
8 2 peter 8 ab 0.0
- 考虑一个 pandas 数据框
用户基于 r_no 基于相同值打开的唯一 cam_id 的数值聚合 输出应该像
建议 (我试过 group by 似乎我增加了复杂性我有一百万行)
df = pd.DataFrame()
df['r_no'] = [1,1,1,2,3,1,1,1,2]
df['user'] = ['sam','sam','sam','sam','peter','jack','jack','Kris','peter']
df['value'] = [76,76,7,8,8,2,29,2,8]
df['cam_id'] = ['ab','abc','ab','ab','ab','abcd','abcd','abcd','ab']
df
您可以使用 value_counts
df['value_count'] = df['r_no'].value_counts()
如果我明白你想做什么
这应该可以解决问题:
unique_count = df.loc[df['r_no']==1].groupby(['user','value'])['cam_id']\
.nunique()\
.rename('count_unique')
df = df.join(unique_count, on=['user','value']).fillna(0)
使用:
(df.merge(df[df['r_no.']==1].groupby(['r_no.','user','value'])['cam_id']
.nunique()
.rename('count_unique').reset_index(),
on=['r_no.','user','value'], how='left').fillna(0))
输出:
r_no. user value cam_id count_unique
0 1 sam 76 ab 2.0
1 1 sam 76 abc 2.0
2 1 sam 7 ab 1.0
3 2 sam 8 ab 0.0
4 2 peter 8 ab 0.0
5 1 jack 2 abcd 1.0
6 1 jack 29 abcd 1.0
7 1 kris 2 abcd 1.0
8 2 peter 8 ab 0.0