我有两个具有不同格式的相似数据的数据框
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)
答案 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"))