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

Python 将主数据帧拆分为循环中的多个数据帧,python,pandas,dataframe,slice,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

我有一个主数据框-

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 

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

'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)
现在您可以在
数据
变量中建立索引。相反,如果您有更多的优柔寡断,您可能不想创建更多的变量

df_1 = data[0]
df_2 = data[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)
现在您可以在
数据
变量中建立索引。相反,如果您有更多的优柔寡断,您可能不想创建更多的变量

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

我们可以使用列表中的键('df_1'、'df_2'、…)创建数据帧的字典

然后,它只是一个填充此字典的循环:

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

我们可以使用列表中的键('df_1'、'df_2'、…)创建数据帧的字典

然后,它只是一个填充此字典的循环:

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

是的,谢谢。这是有道理的!我无法找到一种在列表中添加数据帧而不使用引号的方法。是的,谢谢。这是有道理的!我无法找到一种在列表中添加数据帧而不使用引号传递数据帧的方法。