agg
+ isin
Поскольку кортежи можно хэшировать, вы можете использовать isin
и сравнить агрегированные значения со своими last
.Помогает lst
и список напрямую вместо np.array
.
>>> lst = [('AA', 'P'),
('BB', 'Q')]
>>> mask = df[['Firstnames', 'Lastnames']].agg(tuple, 1).isin(lst)
>>> df[mask]
Firstnames Lastnames values
0 AA P 10
1 BB Q 13
3 AA P 22
Если хотите, вы можете sort_values
по именам
>>> df[mask].sort_values(by=['Firstnames', 'Lastnames'])
Firstnames Lastnames values
0 AA P 10
3 AA P 22
1 BB Q 13
pd.concat
Вы также можете использовать список понимания и pd.concat
для меньших lst
s
>>> pd.concat([df[df.Firstnames.eq(a) & df.Lastnames.eq(b)] for a,b in lst])
Firstnames Lastnames values
0 AA P 10
3 AA P 22
1 BB Q 13
Время:
Маленький lst
, большой df
df = pd.concat([df]*10000).reset_index(drop=True)
%timeit mask = df[['Firstnames', 'Lastnames']].agg(tuple, 1).isin(lst); df[mask].sort_values(by=['Firstnames', 'Lastnames'])
942 ms ± 71.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit pd.concat([df[df.Firstnames.eq(a) & df.Lastnames.eq(b)] for a,b in lst])
16.2 ms ± 355 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Для больших lst
и маленький df
c = list(map(''.join, itertools.product(string.ascii_uppercase, string.ascii_uppercase)))
lst = [(a,b) for a,b in zip(c, list(string.ascii_uppercase)*26)]
df = pd.DataFrame({'Firstnames': c, 'Lastnames': list(string.ascii_uppercase)*26, 'values': 10})
%timeit mask = df[['Firstnames', 'Lastnames']].agg(tuple, 1).isin(lst); df[mask].sort_values(by=['Firstnames', 'Lastnames'])
15.1 ms ± 301 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit pd.concat([df[df.Firstnames.eq(a) & df.Lastnames.eq(b)] for a,b in lst])
781 ms ± 33.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)