Разделение главного фрейма данных для объединения фреймов данных в цикле - Панды - PullRequest
0 голосов
/ 07 марта 2019

У меня есть основные данные Frame-

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 ]

1 голос
/ 07 марта 2019

Мы можем создать словарь DataFrames dfs, с ключами из списка ('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
1 голос
/ 07 марта 2019

Это не относится к пандам или фреймам данных, а является основной проблемой программирования. Вы пытаетесь присвоить переменную строке. То есть:

'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]
...