我正在尝试检查Dataframe" Actual"中是否注明了每一行的值。匹配Dataframe" Estimate"中同一行下的值。列位置并不重要。该值只需存在于不同数据帧之间的同一行级别上。如果需要,可以将数据帧连接/合并。 我在我的代码下面提供::
Actual=pd.DataFrame([[4,7,2,8,1],[1,5,7,9,8]], columns=['Actual1','Actual2','Actual3','Actual4','Actual5'])
estimate=pd.DataFrame([[1,2,7,9,3],[0,8,2,5,9]], columns=['estimate1','estimate2','estimate3','estimate4','estimate5'])
Actual
Actual1 Actual2 Actual3 Actual4 Actual5
0 4 7 2 8 1
1 1 5 7 9 8
estimate
estimate1 estimate2 estimate3 estimate4 estimate5
0 1 2 7 9 3
1 0 8 2 5 9
我尝试使用Pandas ::
for loop1 in range(1,6,1):
for loop2 in range(1,6,1):
Actual['want'+str(loop1)]=np.where(Actual['Actual'+ str(loop1)] == estimate['estimate' + str(loop2)],1,0)
最后,我想要的输出::
want=pd.DataFrame([[0,1,1,0,1],[0,1,0,1,1]], columns=['want1','want2','want3','want4','want5'])
want
want1 want2 want3 want4 want5
0 0 1 1 0 1
1 0 1 0 1 1
所以,正如我之前提到的那样,因为来自Dataframe" Actual"值4在整个第一行数据帧中不存在"估计",列"想要1"已经赋值为0.再一次,考虑到Dataframe的第一行" Actual"第5列,其中value = 1,因为该值存在于数据帧的第一行#34;估计" (列位置无关紧要)列' want5'已被赋值为1.
感谢。
答案 0 :(得分:2)
假设您的Actual
和estimate
数据框中的索引相同,一种方法是apply
沿isin
列进行检查。
Actual.apply(lambda x: x.isin(estimate.loc[x.name]), axis=1).astype('int')
这里我们使用name
属性作为两个DataFrame之间的粘合剂。
<强>演示强>
>>> Actual.apply(lambda x: x.isin(estimate.loc[x.name]), axis=1).astype('int')
Actual1 Actual2 Actual3 Actual4 Actual5
0 0 1 1 0 1
1 0 1 0 1 1