gpt4 book ai didi

python - pandas - 对 nunique 值进行分组和计数

转载 作者:行者123 更新时间:2023-11-30 23:11:19 25 4
gpt4 key购买 nike

我有这种数据框 df:

User,C,G
111,ar,1
112,es,1
112,es,1
112,es,2
113,es,2
113,es,3
113,es,3
114,es,4

我想返回的输出是:

G,nU,ar,es
1,2,1,1
2,2,0,2
3,1,0,1
4,1,0,1

基本上,对于每个 G,我会计算 nU 列中不同 User 的数量以及出现的次数C 中的字符串。每个用户都有一个唯一的C值。例如,在G数字1中,我有两个用户(111和112),其中一个出现在'ar'中,一个出现在'es'中(无论是否有两个112出现,我只是需要(112,'es')单例夫妇)。对 'ar' 和 'es' 列求和应返回 nU 列。到目前为止我尝试过这个:

d = df.reset_index().groupby('G')['User'].nunique()

它正确返回用户计数,但没有有关 C 列的信息。

对于这可能造成的困惑,我们深表歉意。

最佳答案

给定df

result = df.groupby(['G', 'User'])['C'].value_counts()

产量

G  User    
1 111 ar 1
112 es 2
2 112 es 1
113 es 1
3 113 es 2
4 114 es 1
dtype: int64

这会计算 ares 的每次出现。我们实际上只想计算唯一出现的次数,因此让我们将系列中的每个值设置为 1:

result[:] = 1

这样结果看起来像

G  User    
1 111 ar 1
112 es 1
2 112 es 1
113 es 1
3 113 es 1
4 114 es 1
dtype: int64

现在,如果我们按第一个和最后一个索引级别(G 值和 C 值)进行分组,并对每个组求和,

result = result.groupby(level=['G',-1]).sum()

我们得到

G    
1 ar 1
es 1
2 es 2
3 es 1
4 es 1
dtype: int64

现在我们可以取消最后一个索引级别的堆栈:

result = result.unstack()

获取

   ar  es
G
1 1 1
2 NaN 2
3 NaN 1
4 NaN 1

用零填充 NaN:

result = result.fillna(0)

定义nU列和行的总和:

result['nU'] = result.sum(axis=1)

并对列重新排序:

result = result[['nU', 'ar', 'es']]
<小时/>

把它们放在一起:

import pandas as pd
df = pd.read_csv('data')
result = df.groupby(['G', 'User'])['C'].value_counts()
result[:] = 1
result = result.groupby(level=['G',-1]).sum()
result = result.unstack()
result = result.fillna(0)
result['nU'] = result.sum(axis=1)
result = result[['nU', 'ar', 'es']]

产量

   nU  ar  es
G
1 2 1 1
2 2 0 2
3 1 0 1
4 1 0 1

关于python - pandas - 对 nunique 值进行分组和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30213185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com