我有一个主数据框架-
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
答案 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