如何防止嵌套循环中 pandas 系列的 IndexError?

How to prevent IndexError of pandas series in a nested loop?

我有一个嵌套循环。在外循环中,我迭代了比内循环中的 dataframe[key]s 更多的键。这会导致 IndexError(在 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'] 的类型是 pandas 系列。

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

if key < len(list):

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

if key in dict:

如果你想从字典中获取一个键(如果它存在),return如果不存在则返回一个默认值,那么你可以使用dict.get():

value = dict.get(key, default)

编辑:

根据 pandas.Series 的文档,您可以使用 Series.get() 方法获取给定键的项目。与 dict.get() 一样,如果找不到密钥,您可以将默认值指定为 return:

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

不优雅,但我可以使用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')