【问题标题】:Populate a new dataframe column with True if two cell values match another smaller subset dataframe in pandas如果两个单元格值与 pandas 中另一个较小的子集数据框匹配,则使用 True 填充新的数据框列
【发布时间】:2021-08-04 02:54:06
【问题描述】:

如果两个单元格值与 pandas 中另一个较小的子集数据帧匹配,我希望用 True 填充新的数据帧列,否则为 False。

例如,这是我正在构建的原始输出数据帧。

ID    Type
1     A
2     B
3     A
4     A
5     C
6     A
7     D
8     A
9     B
10    A

以及根据某些标准选择的数据帧的较小子集:

ID    Type
1     A
3     A
4     A
5     C
7     D
10    A

我想要完成的是,当输出数据帧中的 ID 和类型与较小的子集数据帧匹配时,我想填充一个名为“结果”的新列并且值等于 True。否则,value 等于 False。

ID    Type    Result
1     A       True
2     B       False
3     A       True
4     A       True
5     C       True
6     A       False
7     D       True
8     A       False
9     B       False
10    A       True

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以.merge() 2 个数据帧使用与原始数据帧为基础的左合并,并打开indicator= 参数以显示合并结果。然后将合并结果更改为True,用于两个数据帧中出现的行,否则更改为False

    df_out = df1.merge(df2, on=['ID', 'Type'] , how='left', indicator='Result')
    df_out['Result'] = (df_out['Result'] == 'both')
    

    解释

    indicator= 参数打开后,Pandas 会显示当前行来自哪个数据帧的合并结果(以bothleft_onlyright_only 表示)

    df_out = df1.merge(df2, on=['ID', 'Type'] , how='left', indicator='Result')
    
    print(df_out)
    
    
       ID Type     Result
    0   1    A       both
    1   2    B  left_only
    2   3    A       both
    3   4    A       both
    4   5    C       both
    5   6    A  left_only
    6   7    D       both
    7   8    A  left_only
    8   9    B  left_only
    9  10    A       both
    

    然后,我们通过布尔掩码将both等转换为True/False,如下:

    df_out['Result'] = (df_out['Result'] == 'both')
    
    print(df_out)
    
    
    
       ID Type  Result
    0   1    A    True
    1   2    B   False
    2   3    A    True
    3   4    A    True
    4   5    C    True
    5   6    A   False
    6   7    D    True
    7   8    A   False
    8   9    B   False
    9  10    A    True
    
    

    【讨论】:

    • 非常感谢!它完美地工作。只是一个快速跟进:无论如何我们可以将“结果”列标记为正确时为真;否则不正确?
    • @SkipperLin 可以进一步使用:df_out['Result'] = np.where(df_out['Result'], 'Correct', 'Incorrect') 如果还没有包含import numpy as np的导入记得添加。
    • 我的原始数据集中有 1457 条记录。由于我在每次运行验证测试后不断添加一个新列,我最终有 1657 条记录。想联系一下,看看额外的 200 条记录是不是因为“ID”和“Type”不是唯一的。无论如何我们可以确保无论我们如何合并它,它仍然是 1457 条记录。非常感谢。
    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多