首页 > 解决方案 > 有没有一种 Pythonic 方法来获取与失败的 dict 或 pandas 行分配相关的键?

问题描述

我有一个数据管道,我们将数据作为 pandas DataFrame 处理。我们需要对每一行进行一系列操作,其中某一列的某些操作依赖于其他列中的值,因此我们使用 pandas apply,类似于:

def check_row(row):
    if row['C'] == 'foo':
        row['B'] += row['A']
        
    row['C'] = row['C'].zfill(5)
    
    #etc
    
    return row

df = pd.DataFrame([(1, 2, 'foo'), 
                   (4, 5, 'bar'), 
                   (7,8,'baz')], 
                  columns=['A', 'B', 'C'])

df.apply(check_row, axis=1)

有时,进入此管道的数据不满足我们的假设,并且会生成异常(例如 C 列中的非字符串值)。我想捕捉这些异常并标记这些行。

目前我们将整个 check_row 函数包装在一个 try-except 块中,并将这些行记录为问题(有很多这样的分配)。但是,我们忘记了哪个实际分配失败了。除了将每个都包装在自己的 try-except 中之外,是否有更 Pythonic 的方法来捕获特定的分配?这感觉很难看:

def check_row(row):
    try:
        if row['C'] == 'foo':
            row['B'] += row['A']
    except Exception as e:
        row['errors'] = f"Failed to assign to B: {repr(e)}"

    try:
       row['C'] = row['C'].zfill(5)
    except Exception as e:
        row['errors'] = f"Failed to assign to C: {repr(e)}"
    
    #etc
    
    return row

我想到了类似的东西:

def assign(column, value):
    """inside the scope of check_row"""
    try:
        row[column] = value
    except Exception as e:
        row['errors'] = f"Failed to assign to {column}: {repr(e)}"

但是当然它的价值计算失败了,而不是实际的分配,所以这并不能完全做到。

标签: pythonpandas

解决方案


推荐阅读