Python 数据帧的子集,其中两列等于两个列表
我有多个数据帧,每个数据帧大约有500万行。 每个数据帧有两列,分别称为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",
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