猿问

如何在不迭代的情况下根据特定对从数据框中选择结果?

我想根据某些特定对从数据帧中查询(或定位)子数据帧。


使用迭代很容易做到这一点,但速度很慢。


import pandas as pd

df=pd.DataFrame([[1,2,3], [1,5,6], [7,8,9], [2,3,8]], columns=['x','y','z'])

df

Out[4]: 

   x  y  z

0  1  2  3

1  1  5  6

2  7  8  9

3  2  3  8

我想得到一个子数据框,其中 (x,y)=(1,2) 和 (x,y)=(1,5) 和 (x,y)=(2,3),如下所示


Out[5]: 

   x  y  z

0  1  2  3

1  1  5  6

3  2  3  8

我的方法是使用迭代来获取索引:


xy_list=[(1,2),(1,5),(2,3)]

index_list=[]

for x,y in xy_list:

    index_list+=df.query('x==@x & y==@y').index.tolist()

df_sub=df.loc[index_list]

df_sub

Out[6]: 

   x  y  z

0  1  2  3

1  1  5  6

3  2  3  8

有没有什么方法可以在不使用迭代的情况下做到这一点?


倚天杖
浏览 151回答 2
2回答

慕村9548890

你很接近,但你不需要query反复调用。只需使用构建您的查询字符串str.join并query在之后进行一次调用。data = [(1, 2), (1, 5), (2, 3)]pattern = '(' + ') | ('.join(f"x == {a} & y == {b}" for a, b in data) + ')'pattern# '(x == 1 & y == 2) | (x == 1 & y == 5) | (x == 2 & y == 3)'df.query(pattern)   x  y  z0  1  2  31  1  5  63  2  3  8另一种选择是使用Index.isin和一些过滤:df[df.set_index(['x', 'y']).index.isin(data)]   x  y  z0  1  2  31  1  5  63  2  3  8或者,使用MultiIndex.from_arrays以下方法构建 MultiIndex :df[pd.MultiIndex.from_arrays([df['x'], df['y']]).isin(data)]   x  y  z0  1  2  31  1  5  63  2  3  8结果相同,效率更高。

婷婷同学_

或者你可以做一个df.set_index()and df.loc[]:xy_list=[(1,2),(1,5),(2,3)]df_new=df.set_index(['x','y']).loc[xy_list].reset_index()   x  y  z0  1  2  31  1  5  62  2  3  8
随时随地看视频慕课网APP

相关分类

Python
我要回答