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