我有一个标有
的列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
答案 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