问题描述
有两个数据帧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