2017-10-26 17 views
1

に従ってデータフレームの列の重複した値を削除します。何百万行ものデータフレームでデータのクリーニングを実行しています。 それは、この例のようになります。ID番号

id transaction_date expire_date 
0 A 2015-01-01  2015-02-01 
1 A 2015-01-01  2015-03-14 
2 A 2015-01-01  2015-06-19 
3 A 2015-01-01  2015-07-01 
4 B 2016-02-02  2016-03-02 
5 C 2016-01-01  2016-01-15 

私は意味をなさない期限切れと異なる日付と同じ日に3つのほど多くのトランザクションに行0から削除したいと思います。それは正しい方法

私はこの

df.drop_duplicates(subset='transaction_date') 

と思っていますか?

+0

必要性のチェック2列は 'df.drop_duplicates(サブセット=必要な場合['id'、 'transaction_date']) ' – jezrael

+0

私は答えにコメントを投稿します...... df.drop_duplicates(サブセット= ['id'、 'transaction_date']、keep = False)' – Wen

答えて

0

それはあなたが必要なものによって異なります。

#if need check all duplicates per id and transaction_date and drop them 
df = df.drop_duplicates(subset=['id','transaction_date'],keep=False) 
print (df) 
    id transaction_date expire_date 
4 B  2016-02-02 2016-03-02 
5 C  2016-01-01 2016-01-15 

expire_dateをチェックし、すべてがすべて異なる日付で行をdupes削除が必要な場合:

#check count per group and count unique values in expire_date 
df1 = df.groupby(['id', 'transaction_date']) 
     .agg({'transaction_date':'size', 'expire_date':'nunique'}) 
#get all same count, but remove unique rows 
mask = (df1['transaction_date'] == df1['expire_date']) & (df1['transaction_date'] > 1) 

#create mask by join to original df 
m = df.join(mask.rename('m'), on=['id','transaction_date'])['m'] 
print (m) 
0  True 
1  True 
2  True 
3  True 
4 False 
5 False 
Name: m, dtype: bool 

#last filter by inverting mask by ~ 
df = df[~m] 
print (df) 
    id transaction_date expire_date 
4 B  2016-02-02 2016-03-02 
5 C  2016-01-01 2016-01-15