Python 在多个数据帧上执行相同操作的正确方法是什么?

Python 在多个数据帧上执行相同操作的正确方法是什么?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在努力: 检查数据帧中是否存在范围内的值 如果不是,则添加值并插值 关于,我已经检查了它是否适用于单个数据帧。例如: # Original dataframe code ratio ... 5 5.0 1.649561 6 6.0 1.466403 7 11.0 1.696970 8 12.0 1.646259 # Code to add row + interpolate for i in range(5, 13): i

我正在努力:

  • 检查数据帧中是否存在范围内的值
  • 如果不是,则添加值并插值
  • 关于,我已经检查了它是否适用于单个数据帧。例如:

    # Original dataframe
    
        code    ratio
    ...
    5   5.0     1.649561
    6   6.0     1.466403
    7   11.0    1.696970
    8   12.0    1.646259
    
    # Code to add row + interpolate
    for i in range(5, 13):
        if i not in df.values:
            df.loc[-1, 'code'] = i
            df = df.sort_values('code').reset_index(drop=True)
            df = df.interpolate()
    
    # Result
    code        ratio
    0   5.0     1.649561
    1   6.0     1.466403
    2   7.0     1.581686
    3   8.0     1.639328
    4   9.0     1.668149
    5   10.0    1.682559
    6   11.0    1.696970
    7   12.0    1.646259
    
    检查它是否在单个数据帧上工作,我希望它在我拥有的多个数据帧上工作。因此,我尝试了以下代码,使用数据帧列表进行迭代:

    for df in [df1, df2, df3...]:
        for i in range(5, 13):
            if i not in df.values:
                df.loc[-1, 'code'] = i
                df = df.sort_values('code').reset_index(drop=True)
                df = df.interpolate()
    
    然后,即使对于以前工作过的数据帧,它也会返回:

    code        ratio
    5   5.0     1.649561
    6   6.0     1.466403
    7   11.0    1.696970
    8   12.0    1.646259
    -1  7.0     NaN
    
    这显然不是我想要的结果

    造成这种差异的原因是什么?
    使用多个数据帧列表进行迭代是否是一种错误的方法?

    您需要重新分配到列表中,然后解包,例如:

    df_list = [df1, df2, df3...]
    for i, df in enumerate(df_list):
        for j in range(5, 13):
            if j not in df.values:
                df.loc[-1, 'code'] = j
                df = df.sort_values('code').reset_index(drop=True)
                df = df.interpolate()
        df_list[i] = df
    
    #Unpack back to original variables
    df1, df2, df3, ... = df_list
    

    您可以使用
    inplace=True
    直接修改列表中的每个数据帧。因为数据帧列表是每个数据帧的浅拷贝,所以对它们的任何修改都会影响原始数据帧。但是,此方法不允许链接方法,因此需要使用
    inplace=True
    将chain命令分解为单独的方法调用。此方法利用列表创建数据帧的浅层副本

    Sample dataframes
    
    In [153]: df1
    Out[153]:
       code     ratio
    0   5.0  1.649561
    1   6.0  1.466403
    2  11.0  1.696970
    3  12.0  1.646259
    
    In [155]: df2
    Out[155]:
       code     ratio
    0   5.0  1.649561
    1   6.0  1.466403
    2  11.0  1.696970
    3  19.0  1.646259
    
    dfs = [df1, df2]
    
    for df in dfs:
        for i in range(5, 13):
            if i not in df.values:
                df.loc[-1, 'code'] = i
                df.sort_values('code', inplace=True)
                df.reset_index(drop=True, inplace=True)
                df.interpolate(inplace=True)
    
    输出

    In [168]: df1
    Out[168]:
       code     ratio
    0   5.0  1.649561
    1   6.0  1.466403
    2   7.0  1.581686
    3   8.0  1.639328
    4   9.0  1.668149
    5  10.0  1.682560
    6  11.0  1.696970
    7  12.0  1.646259
    
    In [169]: df2
    Out[169]:
       code     ratio
    0   5.0  1.649561
    1   6.0  1.466403
    2   7.0  1.581686
    3   8.0  1.639328
    4   9.0  1.668149
    5  10.0  1.682560
    6  11.0  1.696970
    7  12.0  1.671615
    8  19.0  1.646259
    


    注意:此解决方案只是为了证明它在这个特定问题上是可行的。在更复杂的问题上,这将是不可行的,因为一些命令不支持
    inplace
    ,Pandas正在弃用
    inplace
    选项。

    我建议使用
    dict
    作为带有键
    df1
    df2
    的数据帧的容器。。。而不是
    list
    这里虽然抱歉,它似乎不起作用。假设
    df1
    是我主要检查的数据帧,在使用您的代码并再次使用
    df1
    检查之后,我的问题仍然得到了不想要的结果。即使将
    df.loc[-1,'code']=i
    更改为
    df.loc[-1,'code']=j
    是的,如果您使用列表,它也不会更改该变量,但它会更改
    df_list[0]
    -这就是为什么最好使用dict
    df_dict={'df1':…}
    ,然后,您可以迭代并更新这些值,并使用
    df_dict['df1']
    返回它。好的,这需要对代码进行一些总体更改。。。但我会努力的。即使有效,我也无法接受你的答案。我建议在这样的情况下,在迭代修改数据帧时,最好使用
    dict
    ,使用键
    df1
    df2
    …使用
    对名称进行迭代,在df_dict.items()中使用df:
    ,然后使用
    df_dict[name]返回=df
    似乎也不起作用:(将其解包回原始变量名如何?…所以在我建议的循环之后,最后一行将是
    df1,df2,df3=dfu list
    更好的方法是
    dict
    -imho:)签出并