2016-11-13 150 views
2

我有一个DataFrame df,具有〜250 000行和〜50列。 在列有重复值,像这样(简化):如何修改Pandas DataFrame中重复值的所有行

'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秒)。 任何想法来改善这一点?另一种更高效的解决方案?

+0

“A”列的初始顺序是否重要?我试图看看是否首先执行'df = df.sort_values(by ='A')'是一个大问题。 否则,您的副本是否已在您的示例中分组?或者你可以像['约翰','约翰','notjohn','约翰']? –

+0

“A”的初始顺序并不重要。您可以按'A'对df进行排序。 – Styx

+0

没关系,我已经制定了一个解决方案,但这比@ DSM的转换选项更复杂,更长。 –

回答

2

您输入不完全匹配您的输出(鲍里斯与最大值,例如),但如果我理解你以后,你可以用.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

您的解决方案完美无缺。 0,53s与660s与我的prévious“解决方案”。这是一个很棒的改进!我需要探索并实验transform()方法。 – Styx

相关问题