我正在尝试按一列上的数据帧进行分组,将每一组中的一行中的几列保持不变,并根据一列的值将其他行中的字符串连接成多列。这是一个例子
df = pd.DataFrame({'test' : ['a','a','a','a','a','a','b','b','b','b'],
'name' : ['aa','ab','ac','ad','ae','ba','bb','bc','bd','be'],
'amount' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 9.5],
'role' : ['x','y','y','x','x','z','y','y','z','y']})
df
amount name role test
0 1.0 aa x a
1 2.0 ab y a
2 3.0 ac y a
3 4.0 ad x a
4 5.0 ae x a
5 6.0 ba z a
6 7.0 bb y b
7 8.0 bc y b
8 9.0 bd z b
9 9.5 be y b
我想对分组进行测试,在role ='z'时保留名称和金额,创建一个列(将其命名为X时)将name的值连接起来,并创建另一列(将其命名为Y)当role ='y'时连接名称的值。 [连接值之间用'分隔; ']每个测试值可以有零到多行的角色='x',零到多行的角色='y'和一行的角色='z'。对于X和Y,如果该测试的该角色没有行,则这些字段可以为null。对于角色='x'或'y'的所有行,将删除金额值。所需的输出如下所示:
test name amount X Y
0 a ba 6.0 aa; ad; ae ab; ac
1 b bd 9.0 None bb; bc; be
对于连接部分,我找到了
x.ix[x.role == 'x', X] = "{%s}" % '; '.join(x['name'])
,我也许可以重复它y。我按照name = x[x.role == 'z'].name.first()
的名称和数量尝试了一些方法。我也尝试过定义函数和lambda函数的两条路径,但均未成功。赞赏任何想法。 最佳答案
您可以在apply
之后的groupby
函数中创建自定义列,如下所示,其中g
可以被视为在测试列中具有单个值的子数据帧,并且由于要返回多个列,因此需要创建一个每个组的Series
对象,其中索引是结果中的相应标头:
df.groupby('test').apply(lambda g: pd.Series({'name': g['name'][g.role == 'z'].iloc[0],
'amount': g['amount'][g.role == 'z'].iloc[0],
'X': '; '.join(g['name'][g.role == 'x']),
'Y': '; '.join(g['name'][g.role == 'y'])
})).reset_index()
关于python - Python pandas groupby条件连接字符串成多列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40519697/