Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查一个数据帧中列的值是否在另一个数据帧的列中可用?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何检查一个数据帧中列的值是否在另一个数据帧的列中可用?

Python 如何检查一个数据帧中列的值是否在另一个数据帧的列中可用?,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧- df1_data = {'sym1' :{0:'abc a01',1:'pqr q02',2:'xyz y03',3:'mno o12',4:'lmn l45'}} df1 = pd.DataFrame(df1_data) print df1 df2_data = {'sym2' :{0:'abc a01',1:'xxx p0',2:'xyz y03',3:'mno o12',4:'lmn l45',5:'rrr r1',6:'kkk k3'}} df2 = pd.DataF

我有两个数据帧-

df1_data = {'sym1' :{0:'abc a01',1:'pqr q02',2:'xyz y03',3:'mno o12',4:'lmn l45'}}
df1 = pd.DataFrame(df1_data)
print df1

df2_data = {'sym2' :{0:'abc a01',1:'xxx p0',2:'xyz y03',3:'mno o12',4:'lmn l45',5:'rrr r1',6:'kkk k3'}}
df2 = pd.DataFrame(df2_data)
print df2
输出-

      sym1
0  abc a01
1  pqr q02
2  xyz y03
3  mno o12
4  lmn l45
      sym2
0  abc a01
1   xxx p0
2  xyz y03
3  mno o12
4  lmn l45
5   rrr r1
6   kkk k3
list -> ['xxx p0','rrr r1','kkk k3']
我想检查df2数据帧sym1列中的sym2列值是否可用。如果sym2列中的符号不可用,则我需要sym1列中不可用的符号列表。如果所有符号都可用,则列表必须为空

预期结果-

      sym1
0  abc a01
1  pqr q02
2  xyz y03
3  mno o12
4  lmn l45
      sym2
0  abc a01
1   xxx p0
2  xyz y03
3  mno o12
4  lmn l45
5   rrr r1
6   kkk k3
list -> ['xxx p0','rrr r1','kkk k3']
您可以使用with,然后选择by并转换为
list
by:


下面是另一个更快的解决方案:

In [54]: df2.set_index('sym2').index.difference(df1.set_index('sym1').index).values
Out[54]: array(['kkk k3', 'rrr r1', 'xxx p0'], dtype=object)
或作为列表:

In [74]: df2.set_index('sym2').index.difference(df1.set_index('sym1').index).values.tolist()
Out[74]: ['kkk k3', 'rrr r1', 'xxx p0']
700K和500K DFs的计时:

In [55]: df1 = pd.concat([df1] * 10**5, ignore_index=True)

In [57]: df2 = pd.concat([df2] * 10**5, ignore_index=True)

In [58]: df1.shape
Out[58]: (500000, 1)

In [59]: df2.shape
Out[59]: (700000, 1)

In [67]: %timeit df2.set_index('sym2').index.difference(df1.set_index('sym1').index).values
10 loops, best of 3: 123 ms per loop

In [68]: %timeit df2.ix[~df2.sym2.isin(df1.sym1), 'sym2']
1 loop, best of 3: 216 ms per loop

In [72]: %timeit df2.set_index('sym2').index.difference(df1.set_index('sym1').index).values.tolist()
10 loops, best of 3: 123 ms per loop

@耶斯雷尔-我也得到了结果。我正在使用这个-list(df2[~df2.sym2.isin(df1.sym1)].sym2)。与快速执行相比,哪一个最好?它是相同的:
In[123]:%timeit((df2.ix[~df2.sym2.isin(df1.sym1),'sym2'].tolist())
100个循环,每个循环最好3:3.22ms
-
In[124]:%timeit(list(df2.ix[~df2.sym2.isin(df1.sym1),'sym2'))
100个循环,最佳3:3.22毫秒/循环
如果我希望其他列也使用sym2列,那么我如何获得其他列也使用sym2列?我不确定是否理解,您是否可以添加具有所需输出的数据样本?很好的解决方案,但如果存在重复项,我和您的解决方案中的输出是不同的(既不好也不坏,这取决于OP需要什么)。此外,订单也发生了变化。