在另一个 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
逗号分隔。导出 list
列 Depend
。导出 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
有两个数据帧 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
逗号分隔。导出 list
列 Depend
。导出 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