2016-11-13 148 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

相關問題