Многоуровневое индексирование Python с использованием метода read_csv от pandas - PullRequest
0 голосов
/ 29 августа 2018

Я хочу прочитать следующую таблицу как pandas dataframe

enter image description here

Скажите, что датафрейм df, цель - запросить df ['acct_id'] ['A'] ['0-3_mon] должен дать мне 10

Я сделал это для данных панели, где все является столбцом, а затем вы создаете многоуровневый индекс как для сечения, так и для временного ряда.

Но здесь сами исходные данные имеют более двух уровней столбцов. Как мне прочитать этот CSV как многоуровневый индекс? Я застрял здесь, любая идея.

Некоторые из подобных работ, если вы хотите посмотреть - https://lectures.quantecon.org/py/pandas_panel.html

Большое спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

Создать DataFrame с MultiIndex, потому что deprecate panel:

df = pd.read_csv(file, header=[0,1], index_col=[0])

А затем выберите с помощью слайсеров :

idx = pd.IndexSlice
print (df.loc[1, idx['A', '0-3_mon']])

Пример : без имен Multindex:

import pandas as pd

temp=u"""A;A;B;B
0-3_mon;3-6_mon;0-3_mon;3-6_mon
1;10;12;14;18
2;11;15;17;19
3;13;16;21;20"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", header=[0,1])
print (df)
        A               B        
  0-3_mon 3-6_mon 0-3_mon 3-6_mon
1      10      12      14      18
2      11      15      17      19
3      13      16      21      20

print (df.columns)
MultiIndex(levels=[['A', 'B'], ['0-3_mon', '3-6_mon']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]])

idx = pd.IndexSlice
print (df.loc[1, idx['A', '0-3_mon']])
10

Образец с указанными именами MultiIndex:

import pandas as pd

temp=u"""acct_id;A;A;B;B
level;0-3_mon;3-6_mon;0-3_mon;3-6_mon
1;10;12;14;18
2;11;15;17;19
3;13;16;21;20"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", index_col=[0], header=[0,1])
print (df)
acct_id       A               B        
level   0-3_mon 3-6_mon 0-3_mon 3-6_mon
1            10      12      14      18
2            11      15      17      19
3            13      16      21      20

print (df.columns)

MultiIndex(levels=[['A', 'B'], ['0-3_mon', '3-6_mon']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['acct_id', 'level'])

idx = pd.IndexSlice
print (df.loc[1, idx['A', '0-3_mon']])
10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...