首页 > 解决方案 > 根据另一列 pandas 更改列的值

问题描述

我得到了一组这样的数据

name        rank    sub        id
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    192     0001    2011920001
7 ELEVEN    192     0001    2011920001
7 ELEVEN    999     4417    2019994417
AAR bus     047     0003    2010470003
AAR bus     050     0004    2010500004

id公式是= 201 + rank + value。我想检查“名称”列是否具有相同的值,如果是,将“等级”和“子”列更改为该组名称中的最小值,以便所有“id”都相同

这就是我想要的

name        rank    sub        id
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
7 ELEVEN    049     0001    2010490001
AAR bus     047     0003    2010470003
AAR bus     047     0003    2010470003

有什么办法可以解决这个问题

标签: pythonpandas

解决方案


GroupBy.transform与指定列表中的列一起使用min并重新分配:

df[['rank','sub','id']] = df.groupby('name')['rank','sub','id'].transform('min')
print (df)
       name rank   sub          id
0  7 ELEVEN  049  0001  2010490001
1  7 ELEVEN  049  0001  2010490001
2  7 ELEVEN  049  0001  2010490001
3  7 ELEVEN  049  0001  2010490001
4  7 ELEVEN  049  0001  2010490001
5  7 ELEVEN  049  0001  2010490001
6  7 ELEVEN  049  0001  2010490001
7  7 ELEVEN  049  0001  2010490001
8   AAR bus  047  0003  2010470003
9   AAR bus  047  0003  2010470003

或者:

df[['rank','sub']] = df.groupby('name')['rank','sub'].transform('min')
df['id'] = '201' + df['rank'] + df['sub']
print (df)
       name rank   sub          id
0  7 ELEVEN  049  0001  2010490001
1  7 ELEVEN  049  0001  2010490001
2  7 ELEVEN  049  0001  2010490001
3  7 ELEVEN  049  0001  2010490001
4  7 ELEVEN  049  0001  2010490001
5  7 ELEVEN  049  0001  2010490001
6  7 ELEVEN  049  0001  2010490001
7  7 ELEVEN  049  0001  2010490001
8   AAR bus  047  0003  2010470003
9   AAR bus  047  0003  2010470003

推荐阅读