我有一组这样的数据
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
有什么办法解决这个问题
答案 0 :(得分:1)
将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
答案 1 :(得分:0)
您需要为每个rank
创建具有最小值sub
和name
的组,然后用它们替换现有值,然后重新创建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']