根据其他列的唯一组合更改数据框列值

4
我可以为您翻译。以下是您需要翻译的内容:

我有以下数据帧:

 df=pd.DataFrame([[1,11,'a'],[2,12,'b'],[1,11,'c'],[3,12,'d'],[3,7,'e'],
    [2,12,'f']])
 df.columns=['id','code','name']

 print(df)


     id  code name
  0   1    11    a
  1   2    12    b
  2   1    11    c
  3   3    12    d
  4   3     7    e
  5   2    12    f

对于上述数据框,我想要在任何唯一的idcode组合中只有一个name值。例如,行0和2的name应该相同。同样,行1和5的name也应该相同。
       id  code name
   0   1    11    a
   1   2    12    b
   2   1    11    a
   3   3    12    d
   4   3     7    e
   5   2    12    b

请告诉我如何以编程方式完成此操作。我需要在超过100000行上执行此操作。

谢谢

3个回答

6

让我们使用 groupbytransformfirst

df.assign(name=df.groupby(['id','code'])['name'].transform('first'))

输出:

   id  code name
0   1    11    a
1   2    12    b
2   1    11    a
3   3    12    d
4   3     7    e
5   2    12    b

1
是的,你领先了10秒钟 :) - MaxU - stand with Ukraine
1
很棒的使用了 groupbytransform - BENY
1
@VenkateshMalhotra,相对于我的答案而言,像这样编程更好。这个答案更像Python解决问题的方式,祝你好运。 - BENY

3

或者您不需要使用 groupby

A=df.sort_values(['id','code','name']).drop_duplicates(['id','code'],keep='first').index
df.loc[~df.index.isin(A),'name']=np.nan
df.sort_values(['id','code','name']).ffill().sort_index()


Out[603]: 
   id  code name
0   1    11    a
1   2    12    b
2   1    11    a
3   3    12    d
4   3     7    e
5   2    12    b

很好的答案,Wen!+1 - Scott Boston
这也非常创新。谢谢你。 - Venkatesh Malhotra

1
这是另一种使用joindrop_duplicates解决问题的方法。然而,我也喜欢@ScottBoston的解决方案。
cols = ['id', 'code']
df.drop('name', 1).join(df.drop_duplicates(cols).set_index(cols), on=cols)

   id  code name
0   1    11    a
1   2    12    b
2   1    11    a
3   3    12    d
4   3     7    e
5   2    12    b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接