将主DataFrame拆分为循环Pandas中的多个数据帧

问题描述 投票:0回答:2

我有一个主数据框架 -

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])切片的数据帧,并且不会在for循环的最后一行中分配给'df_name':

df_name= df 
python pandas dataframe slice
2个回答
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

1
投票

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

'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]
© www.soinside.com 2019 - 2024. All rights reserved.