如何防止嵌套循环中 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')
我有一个嵌套循环。在外循环中,我迭代了比内循环中的 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')