2016-11-13 7 views
2

私は〜250,000行と〜50個の列を持つDataFrame dfを持っています。これらは(簡体字)のような はコラムでは、重複値がある:私がやりたい何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) 

をそれがかかります非常に、非常に長い時間をexec(〜600秒)。 これを改善する考えですか?より効率的にこれを行うためのもう1つのソリューション?

+0

「A」列の最初の順序が重要ですか?私は最初の 'df = df.sort_values(by = 'A') 'が大きな問題であるかどうかを調べようとしています。 それ以外の場合は、例のように重複は既にグループ化されていますか?または、あなたは['ジョン'、 'ジョン'、 'ノージョーン'、 'ジョン'のようなことができますか? –

+0

'A'の最初の順序は重要ではありません。 dfは 'A'でソートすることができます。 – 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,53対660s私のprévious "ソリューション"と。これはすばらしい改良です! transform()メソッドを探索して実験する必要があります。 – Styx

関連する問題