मेरे पास आइटम आईडी की सूची है [1, 2, 3, 4]

मैं उन आईडी के लिए किसी अन्य डेटाफ्रेम से पंक्तियां ढूंढना चाहता हूं। जब कई विकल्प होते हैं तो आप कौन सी पंक्ति चुनते हैं इससे कोई फर्क नहीं पड़ता, मुझे बस जितनी जल्दी हो सके उतनी जल्दी चाहिए।

user_id, item_id

1, 2
1, 3
1, 2
4, 4
5, 4
2, 3
3, 1
3, 2

आउटपुट (संभव में से एक)

user_id, item_id
3, 1
3, 2
2, 3
4, 4

वर्तमान में, मैं item_ids.to_frame().merge(df, on='item_id', how='inner').drop_duplicates(subset=['item_id']) का उपयोग कर रहा हूं, आश्चर्य है कि क्या कोई स्पष्ट बेहतर है?

2
eugene 6 अप्रैल 2019, 15:51

1 उत्तर

सबसे बढ़िया उत्तर

Series.isin, फिर DataFrame.drop_duplicates और यदि आवश्यक हो तो अंतिम छँटाई:

L = [1, 2, 3, 4]

df = df[df['item_id'].isin(L)]
df = df.drop_duplicates('item_id', keep='last').sort_values('item_id')
print (df)
   user_id  item_id
6        3        1
7        3        2
5        2        3
4        5        4

प्रदर्शन - isin बनाम query 10M पंक्तियों में कार्य:

np.random.seed(2019)

item_ids = [1, 2, 3, 4]

N = 10 ** 7
#1% matched values
df = pd.DataFrame({'item_id':np.random.choice(item_ids + [5], p=(.025,.025,.025,.025,.9),size=N)})

In [296]: %timeit df.query('item_id in {}'.format(item_ids))
284 ms ± 12.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [297]: %timeit df[df['item_id'].isin(item_ids)]
174 ms ± 455 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

#50% matched values
df = pd.DataFrame({'item_id':np.random.choice(item_ids+ [5], p=(.125,.125,.125,.125,.5),size=N)})

In [299]: %timeit df.query('item_id in {}'.format(item_ids))
404 ms ± 5.69 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [300]: %timeit df[df['item_id'].isin(item_ids)]
299 ms ± 3.65 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

#90% matched values
df = pd.DataFrame({'item_id':np.random.choice(item_ids+ [5], p=(.225,.225,.225,.225,.1),size=N)})

In [302]: %timeit df.query('item_id in {}'.format(item_ids))
480 ms ± 5.36 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [303]: %timeit df[df['item_id'].isin(item_ids)]
372 ms ± 2.87 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2
jezrael 6 अप्रैल 2019, 13:41