Python Pandas在groupby之后计算列中的特定值,并将其放入新列中

Python Pandas在groupby之后计算列中的特定值,并将其放入新列中,python,pandas,Python,Pandas,我需要在列'u'中计算多列组['a','b','c']中的特定值,并将其值应用于新列[cnt_u1,cnt_u2]中的任何值。这是输入df: df = pd.DataFrame([['u1', 'a1', 'b1', 'c1'], ['u1', 'a1', 'b1', 'c1'], ['', 'a1', 'b1', 'c1'], ['', 'a1',

我需要在列
'u'
中计算多列组
['a','b','c']
中的特定值,并将其值应用于新列
[cnt_u1,cnt_u2]
中的任何值。这是输入df:

    df = pd.DataFrame([['u1', 'a1', 'b1', 'c1'],
                       ['u1', 'a1', 'b1', 'c1'],
                       ['', 'a1', 'b1', 'c1'],
                       ['', 'a1', 'b1', 'c2'],
                       ['u2', 'a1', 'b1', 'c2'],
                       ['', 'a1', 'b1', 'c2'],
                       ['', 'a2', 'b1', 'c3'],
                       ['u2', 'a2', 'b1', 'c1'],
                       ['u2', 'a2', 'b1', 'c1'],
                       ['u2', 'a2', 'b1', 'c1'],
                       ['', 'a2', 'b1', 'c1'],
                       ['u3', 'a2', 'b3', 'c2']
                       ], columns=['u', 'a', 'b', 'c'])
您可以在下面找到所需的输出。请注意,我只感兴趣的是一组特定的值
u1,u2
,即跳过
u3

     u   a   b   c cnt_u1 cnt_u2
0   u1  a1  b1  c1     2     0
1   u1  a1  b1  c1     2     0
2       a1  b1  c1     2     0
3       a1  b1  c2     0     1
4   u2  a1  b1  c2     0     1
5       a1  b1  c2     0     1
6       a2  b1  c3     0     0
7   u2  a2  b1  c1     3     0
8   u2  a2  b1  c1     3     0
9   u2  a2  b1  c1     3     0
10      a2  b1  c1     3     0
11  u3  a2  b3  c2     0     0
我设法做到的是在什么地方应用计数:

for s in ('u1', 'u2'):
    df[f'x_{s}'] = df.groupby(['a', 'b', 'c'])['u'].transform(lambda x: (x == s).any())
     u   a   b   c   x_u1   x_u2
0   u1  a1  b1  c1   True  False
1   u1  a1  b1  c1   True  False
2       a1  b1  c1   True  False
3       a1  b1  c2  False   True
4   u2  a1  b1  c2  False   True
5       a1  b1  c2  False   True
6       a2  b1  c3  False  False
7   u2  a2  b1  c1  False   True
8   u2  a2  b1  c1  False   True
9   u2  a2  b1  c1  False   True
10      a2  b1  c1  False   True
11  u3  a2  b3  c2  False  False

如果
'u'
中的值等于'u1'并放入
'cnt\u u1'
列(分别为
'u2'
),如何获得每组的计数?我不认为转换/任何方法都是最好的,我愿意接受任何可以按预期工作的方法

我相信您需要
sum
来计算
True
s值:

for s in ('u1', 'u2'):
    df[f'x_{s}'] = df.groupby(['a', 'b', 'c'])['u'].transform(lambda x: (x == s).sum())
或者,您可以指定新列并仅使用
sum

for s in ('u1', 'u2'):
    df[f'x_{s}'] = df.assign(u = (df.u == s).astype(int)).groupby(['a', 'b', 'c'])['u'].transform('sum')

print (df)
     u   a   b   c  x_u1  x_u2
0   u1  a1  b1  c1     2     0
1   u1  a1  b1  c1     2     0
2       a1  b1  c1     2     0
3       a1  b1  c2     0     1
4   u2  a1  b1  c2     0     1
5       a1  b1  c2     0     1
6       a2  b1  c3     0     0
7   u2  a2  b1  c1     0     3
8   u2  a2  b1  c1     0     3
9   u2  a2  b1  c1     0     3
10      a2  b1  c1     0     3
11  u3  a2  b3  c2     0     0