在另一df中查找一行的所有单元格,如果所有的单元格都使用熊猫存在,则返回标志

问题描述

有两个数据帧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中的查找进行比较。

解决方法

我将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,T1238]    T
1  B1234  [B1235,B1238]    F
2  N1234  [N1235,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