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