【问题标题】:How to prevent IndexError of pandas series in a nested loop?如何防止嵌套循环中熊猫系列的IndexError?
【发布时间】:2019-10-31 13:55:52
【问题描述】:

我有一个嵌套循环。在外循环中,我遍历比内循环中的数据帧[键]更多的键。这会导致 IndexError (key cannot be found in dataframe[key]. 我需要一种方法来检查键是否匹配。

f.e.只是关键列:

dfKeys                    dataframe
-------                   --------
 key                         key
  1                           1
  1                           3
  3                           5
  3                           9
  3
  4
  4
  5
  5
  5
  5
  8
  8
  9
  9
  9 

grouped=dfKeys.groupby('key')
for key, group in grouped:
    if ((group.someCol=='someVal').any() or ~(group.someCol.isin(someArray).any())):
        if(key in dataframe['key']): #######this did not solve it, always false (but there have to be some matches) 
            foundIndex=dataframe[dataframe['key']==key].index.values.astype(int)[0] #INDEXERROR after some loops if there is no 'if' above
            dataframe.loc[foundIndex,'myCol']='myVal'

dataframe['key']的类型是熊猫系列。

【问题讨论】:

    标签: python dataframe sklearn-pandas index-error


    【解决方案1】:

    如果它是您循环遍历的列表,那么您可以检查索引是否在列表的长度内:

    if key < len(list):
    

    如果是字典,你可以检查键是否存在:

    if key in dict:
    

    如果你想从 dict 中获取 key 是否存在,如果不存在则返回默认值,那么你可以使用dict.get():

    value = dict.get(key, default)
    

    编辑:

    根据 pandas.Series 的文档,您可以使用 Series.get() 方法获取给定键的项目。就像dict.get() 一样,您可以指定一个默认值以在未找到密钥时返回:

    if mySeries.get(myKey, 'default') != 'default':
        #This code will only run if it found `myKey` in `mySeries`
    

    pandas.Series 文档:

    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html

    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.get.html#pandas.Series.get

    【讨论】:

    • dataframe['key'] 是什么数据类型?
    • 这是熊猫系列
    • 我编辑了我的答案,包括如何检查 panda.Series 对象中的键。
    • @Sel 然后您正在检查不存在的键。确保您在 get() 调用中使用了正确的值。打印出您正在比较的值,它可能会帮助您很快找到问题。
    • 我确定有相同的密钥,因为我在我的 try-block 中打印了您推荐的条件。由于我的 try 块运行,它找到了相同的键。但是打印你的条件,它总是输出'default'
    【解决方案2】:

    不优雅,但我可以使用 try-except

    grouped=dfKeys.groupby('key')
    for key, group in grouped:
        if ((group.someCol=='someVal').any() or ~(group.someCol.isin(someArray).any())):
            try: 
                foundIndex=dataframe[dataframe['key']==key].index.values.astype(int)[0] 
                dataframe.loc[foundIndex,'myCol']='myVal'
            except IndexError: print('key not found, continue')
    

    【讨论】:

    • 您是否尝试过在pandas.Series 对象上使用.get() 方法来检查值,正如我在答案中添加的那样?这比添加 try/except 块要干净得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2021-11-10
    • 2020-08-09
    • 2021-01-08
    • 2018-06-20
    相关资源
    最近更新 更多