如果行值包含在单独数据帧的列中,则返回布尔指示符

时间:2017-08-09 00:26:46

标签: python pandas

我有一个标有

的列
df1.['ID1']
    aaa
    aab
    aac
    ...
    zzx
    zzy
    zzz

在另一个数据框中的另一列,标识符包含在ID1列

df2.['ID2']
    aab
    ...
    zzy

我需要在df1中添加一个列,指示每行中的标识符是否包含在df2的列中。所以像这样:

df1.['shared']
aaa   False
aab   True
aac   False
...
zzx   False
zzy   True
zzz   False

3 个答案:

答案 0 :(得分:1)

选项1

使用df.isin

In [233]: df
Out[233]: 
  Col1
0  aaa
1  aab
2  aac
3  zzx
4  zzy
5  zzz

In [234]: df2
Out[234]: 
  Col2
0  aab
1  zzy

In [235]: df.Col1.isin(df2.Col2)
Out[235]: 
0    False
1     True
2    False
3    False
4     True
5    False
Name: Col1, dtype: bool

选项2

您可以使用np.in1d

In [344]: pd.Series(np.in1d(df.Col1, df2.Col2), name='Col1')
Out[344]: 
0    False
1     True
2    False
3    False
4     True
5    False
Name: Col1, dtype: bool

时序:

In [245]: len(df_test)
Out[245]: 60000

In [246]: %timeit df_test.Col1.isin(df2.Col2)  # in this post
1000 loops, best of 3: 1.44 ms per loop

In [247]: %timeit df_test.Col1.apply(lambda x: x in df2.Col2) # df.apply solution
1 loop, best of 3: 601 ms per loop

In [349]: %timeit pd.Series(np.in1d(df_test.Col1, df2.Col2), name='Col1')
100 loops, best of 3: 2.92 ms per loop

答案 1 :(得分:0)

df1['shared'] = df1.ID1.apply(lambda x: x in df2.ID2)

答案 2 :(得分:0)

或者您可以尝试map

df2['Bool']=True
df2.index=df2.Col2
df1.Col1.map(df2.Bool).fillna(False)

Out[239]: 
0    False
1     True
2    False
3    False
4     True
5    False