【问题标题】:Splitting up a Master DataFrame to mutliple DataFrames in a loop- Pandas在循环中将主数据帧拆分为多个数据帧-熊猫
【发布时间】:2025-12-20 13:25:11
【问题描述】:

我有一个主数据框架-

NHE_17.head()

Out[42]: 
                         Var name     1960     1961     1962     1963  
0  Total National Health Expenditures  27214.0  29138.0  31842.0  34595.0   
1                       Out of pocket  12949.0  13357.0  14255.0  15311.0   
2                    Health Insurance   7497.0   8236.0   8999.0   9892.0   
3            Private Health Insurance   5812.0   6468.0   7178.0   7952.0   
4                            Medicare      0.0      0.0      0.0      0.0   

我正在尝试根据循环中传递的索引将此数据帧拆分为多个数据帧:

def slice(idx):
    df_temp= NHE_17.iloc[idx[0]:idx[1]]
    return df_temp

df_list_idx = [['df_1',[0,37]],['df_2',[280,310]]]

for df_name, idx in df_list_idx:
    df = slice(idx)
    df_name= df

理想情况下,我希望将“df_1”分配给 NHE_17.iloc[0:37],将 df_2 分配给 NHE_17.iloc[280:310],依此类推...

但这并没有发生。 df_name 保留使用最后传递的索引切片的数据帧(在这种情况下为 [280:310]),并且不分配给“df_name”,因为它应该在 for 循环的最后一行:

df_name= df 

【问题讨论】:

    标签: python pandas dataframe slice


    【解决方案1】:

    我们可以使用列表中的键 ('df_1', 'df_2', ...) 创建一个 DataFrames dfs 的字典。

    那么这只是一个填充这个字典的循环:

    df = pd.DataFrame({'a': range(500)})
    
    df_list_idx = [['df_1',[0,3]],['df_2',[280,284]]]
    dfs = {}
    for x in df_list_idx:
        k = x[0] # e.g. 'df_1'
        v = x[1] # e.g. [0,3]
        dfs[k] = df.iloc[v[0]:v[1]]
    
    print(dfs['df_1'])
    print(dfs['df_2'])
    

    输出:

       a
    0  0
    1  1
    2  2
           a
    280  280
    281  281
    282  282
    283  283
    

    【讨论】:

      【解决方案2】:

      这与 pandas 或数据框无关,而是一个基本的编程问题。您正在尝试将变量分配给字符串。那就是:

      'a' = 2 # example
      'df_1' = df # what you are trying to do in essence. 
      

      Python 或任何我知道的语言都不允许你这样做,因为字符串(例如'df_1')不是有效的变量名。

      相反,我认为最好的方法是将切片添加到列表中。

      df_list_idx = [[0,37],[280,310]]
      data = []
      for idx in df_list_idx:
          df = slice(idx)
          data.append(df)
      

      现在您可以在 data 变量中建立索引。相反,如果您有更多的优柔寡断,那么您可能无论如何都不想创建更多的变量。

      df_1 = data[0]
      df_2 = data[1]
      

      【讨论】:

      • 好的,谢谢。这就说得通了!我无法找到一种方法来在列表中添加数据框而不用引号传递它。