【问题标题】:pandas DataFrame KeyError: get list of missing keyspandas DataFrame KeyError:获取缺失键的列表
【发布时间】:2017-06-21 11:29:55
【问题描述】:

我正在尝试从数据框 df 中选择与键列表 IDs 匹配的行。

df.loc[IDs]

在极少数情况下,它们的键不包含在 DataFrame 中并且会引发 KeyError:

KeyError: "None of [['001U000001c6OczIAE' '001U000000fgVR9IAM' '0015800000ecNcjAAE'\n '001U000000fgVRDIA2']] are in the [index]"

我能否轻松地从该异常中获取缺失键的列表?不通过异常处理来做到这一点会更好/更干净/更pythonic吗?

【问题讨论】:

    标签: python pandas dataframe exception-handling keyerror


    【解决方案1】:

    如果没有更多信息,您可能忘记了一个步骤 - 您是否将索引设置为 Salesforce ID(假设是这样)?

    例如(随机数据):

    df
        a account
    0   1     abc
    1   3     abc
    2   5     abc
    3   7     def
    4   7     def
    5  34      gf
    6   3      hj
    7  24      hj
    
    lis = ['abc', 'hj']
    df.loc[lis]
    KeyError: "None of [['abc', 'hj']] are in the [index]"
    

    适用于 0.21.0 之前的 pandas 版本

    设置索引后:

    df.set_index('account').loc[lis]
              a
    account    
    abc       1
    abc       3
    abc       5
    hj        3
    hj       24
    

    缺失值不应该抛出错误,而是np.nan值:

    lis = ['abc', 'hj', 'j']
    df.set_index('account').loc[lis]
                a
    account      
    abc       1.0
    abc       3.0
    abc       5.0
    hj        3.0
    hj       24.0
    j         NaN
    

    对于熊猫版本 0.21.0+

    您需要改用数据框方法reindex()。但是,使用重新索引,您将无法在索引中包含重复项(因此,如果没有一些重复数据删除,我上面的示例将无法工作):

    df.set_index('account')\
    .groupby(level=0).first()\  # de-duplicate index here
    .reindex(lis2)
    
               a
    account     
    abc      1.0
    hj       3.0
    j        NaN
    

    如果您尝试继续使用数据框,那么在重复数据删除后使用 reindex() 会导致数据丢失。无论如何,这可能不是查找数据框中缺少的标识符的最佳方法。

    【讨论】:

    • 这很奇怪,我想我通过将index_col=... 传递给pandas.read_csv 正确设置了索引
    • df.head() 的输出是什么?索引中是否存在重复项?
    • 无法显示数据框,但索引中确实有一些重复项,出乎意料。为什么尝试将该列设为索引时没有投诉?
    • 奇怪-我的重复理论不正确,因为我刚刚导入了一个测试 csv 没有任何问题。如果您在导入后查看数据框,索引中的 ID 是否正确?
    • 我可以复制的唯一其他方法是,如果列表中的每个值都不在索引中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2013-10-29
    相关资源
    最近更新 更多