检查另一个数据帧中是否存在值

时间:2017-09-07 07:13:35

标签: python pandas dataframe

我有2个数据帧。

df1

id    marks
1      100
2      200
3      300


df2

name    score  flag
'abc'    100    T
'zxc'    300    F

我正在寻找的是我的df1的第一行, 检查我的df2中的相应列score,并获取该标志。

row = df1.iloc[0]
marks = row['marks']

从df2中找到标记中的相应值,并给出它具有的标记。

for marks 100 ====corresponds to score 100 and flag = T

我不想使用pandas merge,因为我只想查找我的第一行。使用iloc[0]

3 个答案:

答案 0 :(得分:1)

第一行

选项1

您可以使用df.isin

first_flag = df2[df2.score.isin([df1.marks[0]])].flag
print(first_flag)
0    T

要获取值,请使用.values.tolist()

print(first_flag.values.tolist())
['T']

要将单个值作为单个项目使用,请使用.item

print(first_flag.item())
'T'

选项2

使用df.eval

score = df1.marks[0]
first_flag = df2[df2.eval('score == {}'.format(score))].flag
print(first_flag)
0    T

选项3

使用df.eq

score = df1.marks[0]
first_flag = df2[df2.score.eq(score)].flag
print(first_flag) 
0    T

所有行

使用df.merge

flags = df1.merge(df2, left_on='marks', right_on='score').flag
print(flags)
0    T
1    F
Name: flag, dtype: object

如果要为没有标记的行检索NaN,可以进行left加入:

flags = df1.merge(df2, left_on='marks', right_on='score', how='left').flag
print(flags)
0      T
1    NaN
2      F

答案 1 :(得分:0)

你可以

In [437]: df2[df2.score.eq(df1.iloc[0].marks)]   # or  df1.marks[0]
Out[437]:
    name  score flag
0  'abc'    100    T

In [438]: df2[df2.score.eq(df1.iloc[0].marks)].flag
Out[438]:
0    T
Name: flag, dtype: object

或者,使用

In [442]: df2[df2.score == df1.marks.iloc[0]].flag
Out[442]:
0    T
Name: flag, dtype: object

或者,使用查询

In [441]: df2.query('score == @df1.marks[0]').flag
Out[441]:
0    T
Name: flag, dtype: object

答案 2 :(得分:0)

我认为你需要:

a = df2.loc[df2['score'].eq(df1['marks'].iat[0]), 'flag']
print (a)
0    T
Name: flag, dtype: object
a = df2.loc[df2['score'] == df1['marks'].iat[0], 'flag']
print (a)
0    T
Name: flag, dtype: object

标量输出:

b = 'no match' if a.empty else a.item()
print (b)
T