检查一个数据帧的任何值(多列)是否在另一数据帧的任何值(多列)中

时间:2019-07-03 15:37:22

标签: python python-3.x pandas

我有两个具有不同格式的相似数据的数据框

df1:

Nodo      X          Y          Z
CTB3901   CTBX3901   CTBY3901   CTBZ3901
MTR5331   MTRX5331   MTRY5331   MTRZ5331
ADC3451   ADCX3451   ADCY3451   ADCZ3451

df2:

Site_x     Site_y
CTBX3901E  CTBX3901
CTB3901    CTB3901E
CTBZ3901E  CTBZ3901
CTBY3901E  CTB3901
MADX6379E  MADX6379

我想检查df2['Site_x', 'Site_y']中是否有任何条目在df1['Nodo','X','Y','Z']列中。数据不必在两个帧中都位于同一行。

检查后的最终输出如下

Site_x     Site_y   Checked
CTBX3901E  CTBX3901  True
CTB3901    CTB3901E  True
CTBZ3901E  CTBZ3901  True
CTBY3901E  CTB3901   True
MADX6379E  MADX6379  False

请原谅我笨拙的数据集。为了正确地完成这一部分,我不得不粘贴我正在使用的相同数据。

我尝试了使用以下语法的isin方法,但是输出在整个“已检查”列中都为False。

df2['Checked'] = df2[['Site_x','Site_y']].isin(df1[['Nodo','X','Y','Z']]).any(axis=1)

4 个答案:

答案 0 :(得分:3)

np.ravel().isin()一起使用:

df2['Checked']=df2.isin(df1.values.ravel()).any(axis=1)
print(df2)

      Site_x    Site_y  Checked
0  CTBX3901E  CTBX3901     True
1    CTB3901  CTB3901E     True
2  CTBZ3901E  CTBZ3901     True
3  CTBY3901E   CTB3901     True
4  MADX6379E  MADX6379    False

答案 1 :(得分:1)

您非常接近:

df2['checked'] = df2.apply(lambda x: x.isin(df1.stack())).any(axis=1)

答案 2 :(得分:1)

另一种也使用np.ravel()anky_91's答案相同的方法,但随后使用str.contains,该方法可能更通用,但在具有更多列时不易扩展:

df2['Checked'] = df2['Site_x'].str.cat(df2['Site_y']).str.contains('|'.join(df1.values.ravel()))
      Site_x    Site_y  Checked
0  CTBX3901E  CTBX3901     True
1    CTB3901  CTB3901E     True
2  CTBZ3901E  CTBZ3901     True
3  CTBY3901E   CTB3901     True
4  MADX6379E  MADX6379    False

答案 3 :(得分:1)

有趣的脾气暴躁

或者我称之为Funpy

data_id = read.table("subject-3.csv", stringsAsFactors = F, header = T, fill = T, sep="\t", na.strings=c("","NA"))