【问题标题】:if row is missing, data == 0. if not missing use default value如果缺少行,则数据 == 0。如果不缺少,则使用默认值
【发布时间】:2021-09-21 05:48:19
【问题描述】:
def compute(tick):
    df = pd.read_csv(f'{tick}.csv')
    a = df.loc['a'].sum()
    b = df.loc['b'].sum()
    c = df.loc['c'].sum()
    d = (a + b) / c
    return d

在某些数据帧中没有“b”行,因此它返回 KeyError。然后我尝试了以下代码,但它不起作用,谁能帮我提供这个问题的解决方案?

def compute(tick):
    df = pd.read_csv(f'{tick}.csv')
    a = df.loc['a'].sum()
    if df.loc['b'].isnull():
        b == 0
    else:
        b = df.loc['b'].sum()
    c = df.loc['c'].sum()
    d = (a + b) / c
    return d

【问题讨论】:

  • df.loc['b].isnull 检查 'b' 行中的值是否为 null/NaN,而不检查 b 行是否存在。检查索引为'b'的行是否存在:- if 'b' in df.index
  • b = df.loc['b'].sub() if 'b' in df else 0

标签: python pandas dataframe missing-data


【解决方案1】:

试试这个

def compute(tick):
    df = pd.read_csv(f'{tick}.csv')
    
    if b in df.columns: #Check if column b exists.
        b = df.loc['b'].sum()
    else:
        b = 0

    a = df.loc['a'].sum()
    c = df.loc['c'].sum()
    d = (a + b) / c
    return d

【讨论】:

  • 谢谢 Raymond,它成功了,但是我有一个后续问题。为什么在 df.columns 中定义“b”? 'b' 不应该是一行吗?
  • @StockJanitor 对于您的问题,当您read_csv 时,默认情况下为header="infer",这将导致您的ABC 行作为标题/列名。因此,当未找到该列时,它会返回 KeyError。希望这能回答你的问题。也请批准解决方案! :)
  • 哦,我明白了,谢谢,是否有一个按钮让我点击批准解决方案?我是stackoverflow的新手
【解决方案2】:

使用DataFrame.reindex 添加不存在的值abc 行,在df 中也只有3 个过滤行:

def compute(tick):
    df = pd.read_csv(f'{tick}.csv').reindex(['a','b','c'], fill_value=0)
    a = df.loc['a'].sum()
    b = df.loc['b'].sum()
    c = df.loc['c'].sum()
    d = (a + b) / c
    return d

如果使用相同的功能 3 次是可能的使用 sumaxis=1:

def compute(tick):
    df = pd.read_csv(f'{tick}.csv').reindex(['a','b','c'], fill_value=0)
    abc = df.sum(axis=1)

    a = abc.loc['a']
    b = abc.loc['b']
    c = abc.loc['c']
    d = (a + b) / c
    return d

【讨论】:

    【解决方案3】:

    怎么样:-

    def compute(tick):
        df = pd.read_csv(f'{tick}.csv')
        a = df.loc['a'].sum()
        c = df.loc['c'].sum()
        try:
           return(a + df.loc['b'].sum()) / c
        except KeyError:
           pass
        return a / c
    

    【讨论】:

    • 谢谢你,效果很好:D
    猜你喜欢
    • 2011-01-20
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多