Python 查询多索引数据框以区分中的条目和非中的条目
我有一个如下所示的数据帧:Python 查询多索引数据框以区分中的条目和非中的条目,python,pandas,dataframe,indexing,multi-index,Python,Pandas,Dataframe,Indexing,Multi Index,我有一个如下所示的数据帧: FirstDF= C A B 'a' 'blue' 43 'green' 59 'b' 'red 56 'c' 'green' 80 'orange' 72 insDF = FirstDF.loc[zip(SecondDF['A'],SecondDF['B'])] outsDF = FirstDF.loc[~zip(SecondDF['A'],SecondDF['B'])] 其中A和B被
FirstDF=
C
A B
'a' 'blue' 43
'green' 59
'b' 'red 56
'c' 'green' 80
'orange' 72
insDF = FirstDF.loc[zip(SecondDF['A'],SecondDF['B'])]
outsDF = FirstDF.loc[~zip(SecondDF['A'],SecondDF['B'])]
其中A和B被设置为索引。我还有一个数据框,看起来像:
SecondDF=
A B
0 'a' 'green'
1 'b' 'red'
2 'c' 'green'
有没有一种方法可以直接用最后一个查询FirstDF,并获得如下输出
C
59
56
80
我还需要获得SecondDF中没有的值:
C
43
72
我是通过迭代FirstDF的索引来实现的,如下所示,但我希望使用pandas逻辑而不是for循环
ins=[]
outs=[]
for i in FirstDF.index:
if i in zip(SecondDF['A'],SecondDF['B']):
ins.append(i)
else:
outs.append(i)
insDF = FirstDF.loc[ins]
outsDF = FirstDF.loc[outs]
但是,这种方法会导致与大数据集的结果不一致,因为在我的例子中,outsDF数据帧比原始数据帧FirstDF有更多的条目
我也试过这样的方法:
FirstDF=
C
A B
'a' 'blue' 43
'green' 59
'b' 'red 56
'c' 'green' 80
'orange' 72
insDF = FirstDF.loc[zip(SecondDF['A'],SecondDF['B'])]
outsDF = FirstDF.loc[~zip(SecondDF['A'],SecondDF['B'])]
但这会引起一个错误。
有什么想法吗?您可以将df2中的A列和B列设置为索引,然后合并:
df2.set_index(['A', 'B'], inplace=True)
pd.merge(df1,df2,left_index=True, right_index=True)
输出:
您只需在下面使用Pandas
merge
:
>>> pd.merge(df1, df2, on=['A', 'B'])['C']
0 59
1 56
2 80
Name: C, dtype: int64
或
>>> df = df1.merge(df2, left_index=True, right_on=['A','B'])['C'].to_frame()
>>> df
C
0 59
1 56
2 80
和
>>> pd.merge(df1, df2, on=['A', 'B'])
A B C
0 a green 59
1 b red 56
2 c green 80
我还需要得到不在df2中的值,知道吗?试试这个,
df1[~df1.isin(df2.all(axis=1)]
我还需要得到不在df2中的值,知道吗?@AndrésMarulanda,你的值在df1中,但不在df2中?