像熊猫一样处理iloc越界错误的方法?

时间:2018-03-10 21:32:13

标签: python pandas

我有一份Excel报告,其中有几张表格排列在表格中,我正在用Pandas解析它。我正在从报告中抓取的关键值对总是在同一列中。因此,我将查找分组到密钥值相同的组中,并使用iloc查找正确的行:

df[df.iloc[:, key_column] == 'apple'][value_column].values[0]

每个文件中都有许多键,但偶尔会出现一个键。在罕见的情况下,永远存在的密钥不存在,整个块将失败(index 0 is out of bounds for axis 0 with size 0

try:
  parsed_xls['fruit'] = df[df.iloc[:, key_column] == 'apple'][value_column].values[0]
  parsed_xls['vegetable'] = df[df.iloc[:, key_column] == 'onion'][value_column].values[0]
  parsed_xls['stationary'] = df[df.iloc[:, key_column] == 'stapler'][value_column].values[0]
except:
  # error reporting

在密钥搜索失败时,将每个密钥,值对放入其自己的try...except或辅助函数以提供零值是不够的... 是否有更多类似Pandas的方式来处理引发此异常的iloc查找(并且仍会捕获错误)?

1 个答案:

答案 0 :(得分:2)

简短的回答是"否" - 当 将逻辑包装在辅助函数中时,我认为没有理由存在这样的功能。

正如您所提到的,如果您偶尔只看到IndexError,请尝试/ except优先于if / else。

import pandas as pd, numpy as np

df = pd.DataFrame(np.random.randint(0, 9, (1000, 10)))

res = df.loc[df.iloc[:, 20] == 6, 5].values[0]
# IndexError: index 0 is out of bounds for axis 0 with size 0

def lookup_fn(df, key_col, key_val, val_col, idx=0):
    try:
        return df[df.iloc[:, key_col] == key_val][val_col].values[idx]
    except IndexError:
        return 0

res = lookup_fn(df, 20, 6, 5)
# 0