【问题标题】:Check for a value from one dataframe exists in another检查一个数据框中的值是否存在于另一个数据框中
【发布时间】:2017-09-07 07:13:35
【问题描述】:

我有 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的marks中找到对应的值,并给出它的Flag。

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

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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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
    

    【讨论】:

    • 不使用merge就不行!合并给了我所有的行,我只想要第一行,使用 iloc[0]
    • @SRingne 添加了更多选项。你有很多选择:p
    • @COLDSPEED ,好的,我找到了那个标志。第二步:- 我可以将该特定标志从 T 更改为 'F' 吗?作为下一行代码?
    • @SRingne 在任何情况下,您都需要将df2[...].flag 更改为df2.loc[..., 'flag'] = 'F' 但简短的回答是:是的。您需要loc 索引器。
    【解决方案2】:

    你可以

    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
    

    【讨论】:

      【解决方案3】:

      我认为你需要:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2021-12-25
        • 2021-05-07
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        相关资源
        最近更新 更多