Python 数据帧的子集,其中两列等于两个列表

Python 数据帧的子集,其中两列等于两个列表,python,pandas,Python,Pandas,我有多个数据帧,每个数据帧大约有500万行。 每个数据帧有两列,分别称为B和C。此外,我还有两个值列表,其中第一个列表中的索引0对应于第二个列表中的索引0 我需要做的是获取完整数据帧的子集,但是两个列表中的值都是特定索引的tru 所以基本上: df = A B C ------------------ val1 val2 val3 val4 val5 val6 val7 val8 val9 list1 = ["val2",

我有多个数据帧,每个数据帧大约有500万行。 每个数据帧有两列,分别称为
B
C
。此外,我还有两个值列表,其中第一个列表中的索引0对应于第二个列表中的索引0

我需要做的是获取完整数据帧的子集,但是两个列表中的值都是特定索引的tru

所以基本上:

df = 

A      B      C
------------------
val1   val2   val3
val4   val5   val6
val7   val8   val9


list1 = ["val2", "val8"]

list2 = ["val3", "val9"]
如果我用这个:

df.loc[(df['B'] == "val2") & (df['C'] == "val3")]
然后返回:

df_new = 

A      B      C
------------------
val1   val2   val3
但是我需要它对
list1
list2
中的所有列表项执行此操作,因此结果df应该是:

df_new = 

A      B      C
------------------
val1   val2   val3 
val7   val8   val9
我正在考虑创建一个新列(
new\u column
)和一个新列表(
new\u list
),其中两个列表名连接在一起,然后运行:

df[df['new_column'].isin(new_list)]
但我有点担心,考虑到我必须对大约500万行和许多不同的数据帧执行此操作,这样做效率很低


是的,有什么巧妙的方法吗?

您可以使用列表(列表1和列表2)创建一个数据帧并合并数据帧:

u = pd.DataFrame({"B":list1,"C":list2})
df.merge(u)
#[df.merge(u) for df in df_list] for list


使用
isin
的方法是,需要传递一个
元组
,以防行与两个列表的结果匹配

df[df[['B','C']].agg(tuple,1).isin(tuple(zip(list1,list2)))]
      A     B     C
0  val1  val2  val3
2  val7  val8  val9

该指数是范围指数吗?或者A列是索引?不,A列不是索引。这将是正确的方法~isin没有给出正确的结果~:-)啊,这太狡猾了。工作起来很有魅力。我一直在玩这个,时间更长,但应该比
agg
:):
df[pd.MultiIndex.from_frame(df[[B','C']]).isin(pd.MultiIndex.from_arrays((list1,list2))]
df[df[['B','C']].agg(tuple,1).isin(tuple(zip(list1,list2)))]
      A     B     C
0  val1  val2  val3
2  val7  val8  val9