2017-09-07 41 views
1

我有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

我不想用熊貓merge,因爲我只是想看看我的第一行。使用iloc[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 
+0

不能沒有它使用合併完成! 合併給我所有的行,我只想要它的第一行,使用iloc [0] – Shubham

+0

@SRingne增加了更多的選項。你有很多選擇可供選擇:p –

+0

@COLDSPEED,好吧,我找到了那個標誌。 第二步: - 我可以將那個特殊的標誌從「T」改變爲「F」嗎?作爲下一行代碼? – Shubham

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 
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 
相關問題