Python 如何修改数据帧中重复值的所有行

Python 如何修改数据帧中重复值的所有行,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,我有一个数据帧df,有大约250000行和大约50列。 列中有重复的值,如下所示(简化): 我尝试了以下代码: def myfunc(group): group['C'][group['C']==0]=group['B'][0] return group df=df.groupby('A').apply(myfunc) 这是可行的,但执行需要非常非常长的时间(~600秒)。 有什么改进的办法吗?另一种更高效的解决方案?您的输入与输出不太匹配(例如boris vs.max),但如

我有一个数据帧df,有大约250000行和大约50列。 列中有重复的值,如下所示(简化):

我尝试了以下代码:

def myfunc(group):
    group['C'][group['C']==0]=group['B'][0]
    return group
df=df.groupby('A').apply(myfunc)
这是可行的,但执行需要非常非常长的时间(~600秒)。
有什么改进的办法吗?另一种更高效的解决方案?

您的输入与输出不太匹配(例如boris vs.max),但如果我了解您的要求,您可以使用
.transform(“第一”)


这对我来说只需要几秒钟。

您的“a”列的初始顺序是否如此重要?我想看看是否先执行
df=df.sort_值(by='A')
是一个大问题。否则,您的副本是否已经像示例中那样分组?或者你能说出类似于[john]、[john]、[notjohn]、[john]、[john]、[john]、[john]之类的词吗?“A”的首字母顺序并不重要。你可以按“A”对df进行排序。没关系,我已经想出了一个解决方案,但这比@DSM的转换选项更复杂、更长。你的解决方案非常有效。0,53秒对660秒,我以前的“解决方案”。这是一个伟大的改进!我需要探索和实验transform()方法。
'A'     'B' 'C'
jean    626 626
michel  950 950      
john    382 382     
john    356 382     
max     315 315
clara   886 886
george  619 619
edmund  365 365
edmund  523 365
edmund  703 365
tony    416 416
edgard  108 108
tom     374 374
fanny   784 784
lucy    660 660
paul    728 728
rebecca 919 919
rebecca 131 919
roger   924 924
def myfunc(group):
    group['C'][group['C']==0]=group['B'][0]
    return group
df=df.groupby('A').apply(myfunc)
In [27]: df["C"] = df.groupby("A")["B"].transform("first")

In [28]: df.head(10)
Out[28]: 
         A    B    C
0    jean0  626  626
1  michel0  950  950
2    john0  382  382
3    john0  356  382
4   boris0  315  315
5   clara0  886  886
6  george0  619  619
7  edmund0  365  365
8  edmund0  523  365
9  edmund0  703  365

In [29]: len(df)
Out[29]: 249983