在按组分组后,计算数据框中特定值的数量

3

I have a data frame as follows:

    userID  Correct
0   1050    F
1   1050    T
2   1050    T
3   1050    F
4   1050    F
5   1050    F
6   1050    F
7   1050    F
8   1050    F
9   1050    F
10  1051    F
11  1051    F
12  1051    F
13  1051    F
14  1051    F
15  1051    T
16  1051    F
17  1051    F
18  1051    F
19  1051    T

我希望做的是统计每个用户“Correct”列中T的数量。也就是说,在我们按userID对数据框进行分组之后,我想要一个包含该用户T数量的列。
以下是我所做的,但显然是错误的:
df.groupby('userID').agg({'Correct': lambda x: (x == T).count()})
2个回答

3
你很接近了,使用Truesum:
df1 = df.groupby('userID').agg({'Correct': lambda x: (x == 'T').sum()})
print (df1)
        Correct
userID         
1050          2
1051          2

但更好的方法是先过滤,再计数:
df1 = df[df['Correct'] == 'T'].groupby('userID').size().to_frame('Correct')
print (df1)
        Correct
userID         
1050          2
1051          2

如果要在没有 T 的情况下为 userID 添加 0,请使用reindex

df1 = (df[df['Correct'] == 'T'].groupby('userID')
                              .size()
                              .reindex(df['userID'].unique(), fill_value=0)
                              .to_frame('Correct'))
print (df1)
        Correct
userID         
1050          2
1051          2
333           0

使用sum得到的结果很奇怪。例如,用户1050有两个T,但是sum仅返回1。预先过滤T也不起作用,因为我也需要计数为零的情况。我不想失去每个用户T的计数为零的情况。 - HimanAB
我为此添加了“重新索引”-它将为所有没有“T”的“userID”添加“0”。 - jezrael

2
这将考虑所有的 'F' 并返回 0 :)
df1.groupby('userID').Correct.apply(lambda x : len(x[x=='T']))

Out[371]: 
userID
1050    2
1051    0

输入数据:

df1
Out[372]: 
    userID Correct
0     1050       F
1     1050       T
2     1050       T
3     1050       F
4     1050       F
5     1050       F
6     1050       F
7     1050       F
8     1050       F
9     1050       F
10    1051       F
11    1051       F
12    1051       F
13    1051       F
14    1051       F
15    1051       F
16    1051       F
17    1051       F
18    1051       F
19    1051       F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接