2016-04-18 21 views
0

私はこの同じ観測

ID1  ID2 variables 
    a  b  something 
    b  g  something 
    c  h  something 
    d  i  something 
    a  h  something 

のように見えるのデータフレームを持っているIDがID1とID2の両方に表示された場合、私はID1で、この値の観測データセットから除外することにしたいです。 だからこの場合

ID1  ID2 variables 
    a  b  something  
    c  h  something 
    d  i  something 
    a  h  something 

に私が考慮さ何:

同じIDの複数の観測が存在する場合があります。重複の名前を変更、連結、削除することはできません。

データセットはかなり大きく(数百万の観測値)、各値のループはオプションではありません。

答えて

3

チェックID1がID2からisin値を持っており、使用してそれらを削除した場合.locデータをフィルタリングするためのスライシング。

In [76]: df.loc[~df['ID1'].isin(df['ID2']), :] 
Out[76]: 
    ID1 ID2 variables 
0 a b something 
2 c h something 
3 d i something 
4 a h something 

詳細:

In [77]: df 
Out[77]: 
    ID1 ID2 variables 
0 a b something 
1 b g something 
2 c h something 
3 d i something 
4 a h something 

In [78]: ~df['ID1'].isin(df['ID2']) 
Out[78]: 
0  True 
1 False 
2  True 
3  True 
4  True 
Name: ID1, dtype: bool 

In [79]: df.loc[~df['ID1'].isin(df['ID2']), :] 
Out[79]: 
    ID1 ID2 variables 
0 a b something 
2 c h something 
3 d i something 
4 a h something 
1

私はあなたがboolean indexing~によってブールSeriesを反転してisinを使用することができると思う:

print df.ID1.isin(df.ID2) 
0 False 
1  True 
2 False 
3 False 
4 False 

print ~df.ID1.isin(df.ID2) 
0  True 
1 False 
2  True 
3  True 
4  True 
Name: ID1, dtype: bool 

print df[~df.ID1.isin(df.ID2)] 
    ID1 ID2 variables 
0 a b something 
2 c h something 
3 d i something 
4 a h something 

TESTING

df = pd.concat([df]*100000).reset_index(drop=True) 

In [157]: %timeit df.loc[~df['ID1'].isin(df['ID2']), :] 
10 loops, best of 3: 55.5 ms per loop 

In [158]: %timeit df[~df.ID1.isin(df.ID2)] 
10 loops, best of 3: 55 ms per loop 
1

最も簡単な方法かもしれない

df.query('ID1 not in ID2') 
関連する問題