在另一个列熊猫的基础上更改列的值

时间:2019-09-24 02:13:09

标签: python 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 +排名+值。 我想检查“名称”列是否具有相同的值,如果是这样,请将“等级”和“子”列更改为该组名称中的最小值,以便所有“ 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

有什么办法解决这个问题

2 个答案:

答案 0 :(得分:1)

GroupBy.transformmin一起使用,以指定列表中的列并重新分配:

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

答案 1 :(得分:0)

您需要为每个rank创建具有最小值subname的组,然后用它们替换现有值,然后重新创建id

rank_mins = df[['name', 'rank']].groupby('name').min().reset_index()
sub_mins = df[['name', 'sub']].groupby('name').min().reset_index()
df = df.drop(['rank', 'sub'], axis=1).merge(rank_mins, how='left').merge(sub_mins, how='left')[['name', 'rank', 'sub', 'id']]
df['id'] = '201' + df['rank'] + df['sub']