代码之家  ›  专栏  ›  技术社区  ›  coderoad12

(使用pandas)数据库单元格在函数之外不会更新。怎么办?

  •  1
  • coderoad12  · 技术社区  · 4 年前

    因此,我试图使用上面和下面一行中的值的平均值来填充缺失的数据行。我对编码相对较新,所以我对任何不简洁的代码表示歉意。

    以下是我使用的函数和一些数据。

    import pandas
    
    def avg_round(a,b,c):
        x = float(round((a + b)/2,c))
        return x
    
    def fill_in_single(c,ro): ##ro signifies to how many digits I need to round the new value to, "c" is the column we need to edit
        m_list = single_missing(c) ##this list has all the rows that are empty in the column "c"
        for i_obj in m_list:
            act_row=i_obj-2 ##I need to do this because the rows are stored as their excel row numbers which is different from the pandas df row number
            prev_row=act_row-1
            next_row=act_row+1
            prev_val=c[prev_row]
            next_val=c[next_row]
            new_val=avg_round(prev_val,next_val,ro)
            df.at[act_row,'{}'.format(c)] = new_val
    
    fill_in_single(Column,0)
    print(df.at[2,'Column'])
    
    OUTPUT:
    nan
    
    
       Index Column
        0       1
        1       9
        2 
        3       0
    
    

    因此,当我运行此命令并尝试打印一个所谓的“更新”列的值时,我得到的是“nan”而不是new_val。我在函数中运行了此打印命令,它返回了new-val。我真的不确定该怎么办?

    我还运行了函数外的代码,它正确地更新了列。那么,为什么这个功能不起作用呢?

    1 回复  |  直到 4 年前
        1
  •  0
  •   XXavier    4 年前

    你可以试试这个

    向后和向前填充数据,如下图所示,并在替换时取这两列的平均值 nan

    df['ffill'] = df['y'].ffill()
    df['bfill'] = df['y'].bfill()
    df['y'].fillna(df[['ffill', 'bfill']].mean(axis=1))
    

    这是我使用的数据集

    d = {'x':['a','a','a','b','b','b','c','c','c','d','d','d'],
     'y':[1,np.nan,3,1,2,3,1,np.nan,3,1,2,3]}
    df = pd.DataFrame(d)