首页 > 解决方案 > 在另一个df中查找一行的所有单元格,如果所有单元格都存在,则返回标志使用pandas

问题描述

有两个数据帧 A 和 B,df A 如下所示,包括主节点及其对每个节点的依赖:

 NODE          Depend
=====   =============================
T1234   T1235   T1236   T1237   T1238
-------------------------------------
B1234   B1235   B1236   B1237   B1238
-------------------------------------
N1234   N1235   N1236   N1237   N1238
-------------------------------------

我想从 df B 中的 df A 中查找每一行,以了解它们在 df B 中是否都可用。

Node
=====
T1234
T1235
T1236
T1237
T1238
B1234
B1235
B1238
N1234
N1237

如果一行中的所有单元格(包括 df A 的主节点)在 df B 中可用,则返回 True 标志,否则在 df A 中返回 False 作为新列,如下所示:

 NODE          Depend                 flag
=====   ============================= =====
T1234   T1235   T1236   T1237   T1238   T
-------------------------------------------
B1234   B1235   B1236   B1237   B1238   F
-------------------------------------------
N1234   N1235   N1236   N1237   N1238   F
------------------------------------------- 

通过熊猫做到这一点的最有效方法是什么?我尝试了很多方法,例如合并两个 df,但发现无法将整行与 df B 中的查找进行比较。

标签: pythonpandasrowlookup

解决方案


我会用dfA逗号分隔。导出list列。导出Depend列表dfB。比较lists使用sets和使用np.where (condition, True if Condition, False if condition)。这里的条件是 之间的共同长度lists应该等于four或超过3

print(dfA)#Separated by comma


  NODE                   Depend
0  T1234  T1235,T1236,T1237,T1238
1  B1234  B1235,B1236,B1237,B1238
2  N1234  N1235,N1236,N1237,N1238

s=list(dfB.Node.values.tolist())#dfB into a list
dfA.Depend=dfA.Depend.str.split(',')#dfA.Depend into a list


dfA['flag']=np.where(dfA.Depend.apply(lambda x:len([*{*x}&{*s}])>3), 'T','F')
print(dfA)



NODE                        Depend    flag
0  T1234  [T1235, T1236, T1237, T1238]    T
1  B1234  [B1235, B1236, B1237, B1238]    F
2  N1234  [N1235, N1236, N1237, N1238]    F

推荐阅读