gpt4 book ai didi

python - 基于元组的子集 Pandas 数据框

转载 作者:行者123 更新时间:2023-11-28 20:32:23 26 4
gpt4 key购买 nike

我有这样的数据集

Firstnames = ['AA','BB','CC','AA','CC']
Lastnames = ['P', 'Q', 'R', 'P', 'R']
values = [10, 13, 3, 22, 45]

df = pd.DataFrame(data = list(zip(Firstnames,Lastnames,values)), \
columns=['Firstnames','Lastnames','values'])
df

Firstnames Lastnames values
0 AA P 10
1 BB Q 13
2 CC R 3
3 AA P 22
4 CC R 45

我有一个像这样的元组数组

lst = array([('AA', 'P'), ('BB', 'Q')])

我想对 df 进行子集化,这样 Firstname == 'AA' & Lastnames == 'P'Firstname == 'BB' & Lastnames == 'Q'

我可以手动执行此操作,但是我的数组非常大,我想以编程方式执行此操作

我的预期输出是

Firstnames  Lastnames   values
AA P 10
AA P 22
BB Q 13

最佳答案

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

您还可以使用 list comprehensionpd.concat 来获得更小的 lst

>>> 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)

关于python - 基于元组的子集 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52804320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com