在另一个 df 中查找一行的所有单元格,如果所有单元格都存在,则使用 pandas 标记 return

Lookup all cells of one row in another df and return flag if all exist using 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 中可用,则 return True 标志否则 return 在 df A 中为 False 作为新列,如下所示:

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

通过 pandas 执行此操作的最有效方法是什么?我尝试了很多方法,比如合并两个 df,但发现无法将整行与 df B 中的查找进行比较。

我会用 dfA 逗号分隔。导出 listDepend。导出 dfB 列表。使用 sets 比较 lists 并使用 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

这是另一种方法。我为第一个数据框创建了虚拟列标签:

# the first data frame
print(df_A)
         d-1    d-2    d-3    d-4
Node                             
T1234  T1235  T1236  T1237  T1238
B1234  B1235  B1236  B1237  B1238
N1234  N1235  N1236  N1237  N1238
# the second data frame
print(df_B)
0    T1234
1    T1235
2    T1236
3    T1237
4    T1238
5    B1234
6    B1235
7    B1238
8    N1234
9    N1237
Name: Node, dtype: object

对照 B 检查 A 的每个

df_A['flag'] = df_A.apply(lambda x: x.isin(df_B).all(), axis=1)
print(df_A)

         d-1    d-2    d-3    d-4   flag
Node                                    
T1234  T1235  T1236  T1237  T1238   True
B1234  B1235  B1236  B1237  B1238  False
N1234  N1235  N1236  N1237  N1238  False