在循环中将主数据帧拆分为多个数据帧-熊猫

时间:2019-03-07 14:28:53

标签: python pandas dataframe slice

我有一个主数据框架-

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 

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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