类似于Pandas的方法处理iloc越界错误?

7

我有一个包含多个表格的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查找(并且仍能捕获错误)?


只是想澄清一下,可能不存在的是 key_column 还是 value_column?或者说,在键列中可能没有这样的键存在?到底是哪一个? - cs95
密钥可能不存在。例如,如果在生成报告时只有食品存在,并且没有“订书机”需要报告,则“订书机”密钥不存在。 - xtian
1个回答

6

简短回答是“不”-我认为没有理由使用这样的功能,因为你可以将逻辑包装在辅助函数中。

如果像你所提到的那样,你只偶尔看到IndexError,那么使用try / 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

我只是试图理解编写 Pandas 的方法,以便不会因为这些异常值而过于复杂。在这个日报中,既有极端缺失的情况,也有极少数的添加情况。在处理这些数据的两年时间里,我看到每年添加的数量都小于10。我从未见过某些值缺失,但我必须承认这是可能的。老实说,我不知道是否有一种常见的方法来捕获这个异常。我喜欢这个辅助解决方案。 - xtian
2
我建议您使用 try / except,除非您看到性能下降(通常是太多异常)。如果出现这种情况,您可以轻松地转移到 if / else 语句。类似于:if key_col in range(len(df.columns)):... - jpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接