我正在尝试按一列上的数据帧进行分组,将每一组中的一行中的几列保持不变,并根据一列的值将其他行中的字符串连接成多列。这是一个例子

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条件连接字符串成多列-LMLPHP

关于python - Python pandas groupby条件连接字符串成多列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40519697/

10-09 20:18
查看更多