熊猫在groupby之后计算一列中的特定值并放入新列中

时间:2019-12-23 14:13:28

标签: python pandas

我需要计算proxy_pass http://104.167.123.123:3001;列中多列组['a', 'b', 'c']中的特定值,并将其值应用于新列'u',无论[cnt_u1, cnt_u2]中的值是多少。这是输入df:

'u'

在下面您可以找到所需的输出。请注意,我只对特定的一组值 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 中的值等于'u1'并放入'u'列(分别为'cnt_u1')中的每个组的计数?我并不是说转换/任何方法都是最好的,我对任何可以按预期工作的方法都持开放态度。

1 个答案:

答案 0 :(得分:3)

我相信您需要sum来计数True的值:

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