如何修改Pandas DataFrame中所有重复值的行

3
我有一个DataFrame df,大约有250,000行和50列。 在某一列中存在重复的值,例如(简化):
'A'     'B'
jean    626
michel  950
john    382      
john    356    <-- duplicate value
boris   315
clara   886
george  619
edmund  365
edmund  523    <-- duplicate value
edmund  703    <-- duplicate value
tony    416
edgard  108
tom     374
fanny   784
lucy    660
paul    728
rebecca 919
rebecca 131    <-- duplicate value
roger   924

我想要做的是创建一个名为“C”的新列,其中: - 每当我在“A”中发现一个唯一值时,“C”中的值与“B”中的值相同 - 每当我在“A”中发现重复值时,对应的“C”中的值与重复组的第一个值相同。 一组中的重复数量可能大于20。
结果应该是:
'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)

这个可以运行,但需要非常长的时间才能执行(大约600秒)。有什么办法可以改进吗?还有其他更有效的解决方案吗?

你的'A'列的初始顺序很重要吗?我想知道首先做df = df.sort_values(by='A')是否是一个大问题。 否则,你的重复值是否已经像你的示例那样分组了?或者你可能会有['john', 'john','notjohn','john']这样的情况吗? - Julien Marrec
'A' 的初始顺序并不重要。您可以按 'A' 对 df 进行排序。 - Styx
没关系,我已经想出了一个解决方案,但那比 @DSM 的转换选项更复杂和更长。 - Julien Marrec
1个回答

3

您的输入与输出不完全匹配(例如,Boris与Max),但如果我理解您的意思,您可以使用.transform("first")

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

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


你的解决方案完美地运行了。相较于我之前的“解决方案”,它只需要0.53秒而不是660秒。这是一个巨大的改进!我需要探索和实验transform()方法。 - Styx

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