2016-02-25 6 views
1

Я использую pandas для анализа таблицы Excel. Электронная таблица имеет несколько листов, каждая из которых выглядит следующим образом. Обратите внимание на то, что каждый столбец имеет значение, соответствующее различные даты, и имеет различную длину:Извлечение Pandas multiindex из dataframe с NaT

Excel spreadsheet

По какой-то причине, когда панда анализирует таблицу Excel, то первый лист разбирает первый столбец дат в качестве индекса (хотя параметр index_col был указан как None). Это все еще возможно.

Однако в других листах, он разбирает индекс в качестве мультииндекса:

Screenshot of multiindex

То, что я хочу сделать, это в конечном итоге восстановить dataframe так, что все они имеют общий индекс даты, и любые даты без значений заполняются NaN. Однако я не могу извлечь даты из мультииндекса, чтобы даже начать этот процесс.

Я попытался выполнить reset_index() на dataframe на обоих уровнях 0 и 1, но он жалуется на IndexError: cannot do a non-empty take from an empty axes. Я также попытался unstack(), но жалуется на ValueError: Index contains duplicate entries, cannot reshape.

ответ

0

Я думаю, вы используете read_excel с параметрами parse_cols, header, index_col. Затем создайте DataFrames из каждой пары по iloc и последний concat их один:

import pandas as pd 

df = pd.read_excel('f_name.xlsx', parse_cols=[0, 1, 3, 4, 7 , 8], index_col=0, header=0) 
#if you need reset NaT in index, but it is not necessary 
#df.index = df.index.to_series().fillna(0) 
print df 
      Column_val1 Unnamed: 1 Column_val2 Unnamed: 3 Column_val3 
1999-01-01   4 2000-01-01   5 2000-01-01   5 
1999-01-02   1 2000-01-02   7 2000-01-02   7 
1999-01-03   2 2000-01-03   8 2000-01-03   8 
1999-01-04   3 2000-01-04   3 2000-01-04   3 
1999-01-05   3 2000-01-05   6 2000-01-05   6 
1999-01-06   3 2000-01-06   9 2000-01-06   9 
1999-01-07   4 2000-01-07   1 2000-01-07   1 
1999-01-08   6 2000-01-08   5 2000-01-08   5 
1999-01-09   8 2000-01-09   2 2000-01-09   2 
1999-01-10   2 2000-01-10   3 2000-01-10   3 
1999-01-11   4 2000-01-11   47 2000-01-11   47 
1999-01-12   5 2000-01-12   2 2000-01-12   2 
NaT     NaN 2000-01-13   8 2000-01-13   8 
NaT     NaN 2000-01-14   2 2000-01-14   2 
NaT     NaN 2000-01-15   87 2000-01-15   87 
NaT     NaN 2000-01-16   6 2000-01-16   6 
NaT     NaN 2000-01-17   89 2000-01-17   89 
NaT     NaN  NaT   NaN 2000-01-18   7 
NaT     NaN  NaT   NaN 2000-01-19   8 
print df['Column_val1'] 
1999-01-01  4 
1999-01-02  1 
1999-01-03  2 
1999-01-04  3 
1999-01-05  3 
1999-01-06  3 
1999-01-07  4 
1999-01-08  6 
1999-01-09  8 
1999-01-10  2 
1999-01-11  4 
1999-01-12  5 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
Name: Column_val1, dtype: float64 
print df.set_index(df.iloc[:, 1])['Column_val2'] 
Unnamed: 1 
2000-01-01  5 
2000-01-02  7 
2000-01-03  8 
2000-01-04  3 
2000-01-05  6 
2000-01-06  9 
2000-01-07  1 
2000-01-08  5 
2000-01-09  2 
2000-01-10  3 
2000-01-11 47 
2000-01-12  2 
2000-01-13  8 
2000-01-14  2 
2000-01-15 87 
2000-01-16  6 
2000-01-17 89 
NaT   NaN 
NaT   NaN 
Name: Column_val2, dtype: float64 
print df.set_index(df.iloc[:, 3])['Column_val3'] 
Unnamed: 3 
2000-01-01  5 
2000-01-02  7 
2000-01-03  8 
2000-01-04  3 
2000-01-05  6 
2000-01-06  9 
2000-01-07  1 
2000-01-08  5 
2000-01-09  2 
2000-01-10  3 
2000-01-11 47 
2000-01-12  2 
2000-01-13  8 
2000-01-14  2 
2000-01-15 87 
2000-01-16  6 
2000-01-17 89 
2000-01-18  7 
2000-01-19  8 
Name: Column_val3, dtype: int64 
df = pd.concat([df['Column_val1'], 
       df.set_index(df.iloc[:, 1])['Column_val2'], 
       df.set_index(df.iloc[:, 3])['Column_val3'] ]) 

#better is use sort index 
df = df.sort_index() 
print df 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
NaT   NaN 
1999-01-01  4 
1999-01-02  1 
1999-01-03  2 
1999-01-04  3 
1999-01-05  3 
1999-01-06  3 
1999-01-07  4 
1999-01-08  6 
1999-01-09  8 
1999-01-10  2 
1999-01-11  4 
1999-01-12  5 
2000-01-01  5 
2000-01-01  5 
2000-01-02  7 
2000-01-02  7 
2000-01-03  8 
2000-01-03  8 
2000-01-04  3 
2000-01-04  3 
2000-01-05  6 
2000-01-05  6 
2000-01-06  9 
2000-01-06  9 
2000-01-07  1 
2000-01-07  1 
2000-01-08  5 
2000-01-08  5 
2000-01-09  2 
2000-01-09  2 
2000-01-10  3 
2000-01-10  3 
2000-01-11 47 
2000-01-11 47 
2000-01-12  2 
2000-01-12  2 
2000-01-13  8 
2000-01-13  8 
2000-01-14  2 
2000-01-14  2 
2000-01-15 87 
2000-01-15 87 
2000-01-16  6 
2000-01-16  6 
2000-01-17 89 
2000-01-17 89 
2000-01-18  7 
2000-01-19  8 
dtype: float64 
#if you need remove rows where index is NaT 
print df[pd.notnull(df.index)] 
1999-01-01  4 
1999-01-02  1 
1999-01-03  2 
1999-01-04  3 
1999-01-05  3 
1999-01-06  3 
1999-01-07  4 
1999-01-08  6 
1999-01-09  8 
1999-01-10  2 
1999-01-11  4 
1999-01-12  5 
2000-01-01  5 
2000-01-01  5 
2000-01-02  7 
2000-01-02  7 
2000-01-03  8 
2000-01-03  8 
2000-01-04  3 
2000-01-04  3 
2000-01-05  6 
2000-01-05  6 
2000-01-06  9 
2000-01-06  9 
2000-01-07  1 
2000-01-07  1 
2000-01-08  5 
2000-01-08  5 
2000-01-09  2 
2000-01-09  2 
2000-01-10  3 
2000-01-10  3 
2000-01-11 47 
2000-01-11 47 
2000-01-12  2 
2000-01-12  2 
2000-01-13  8 
2000-01-13  8 
2000-01-14  2 
2000-01-14  2 
2000-01-15 87 
2000-01-15 87 
2000-01-16  6 
2000-01-16  6 
2000-01-17 89 
2000-01-17 89 
2000-01-18  7 
2000-01-19  8 
dtype: float64 
Смежные вопросы