Значения индекса силы должны присутствовать - PullRequest
0 голосов
/ 02 сентября 2018

Я хотел бы построить временной ряд из DataFrame. Он многоиндексирован, и каждое движение в пределах одного индекса соответствует постоянному сдвигу во времени. Однако показатели не все присутствуют. Как я могу расширить данные (для будущего заполнения или другого вменения) так, чтобы некоторые уровни индексов были вынуждены иметь все свои значения?

# Example: here I0 is a running number and I1 to be forced to have 0 and 1 for every I0.

I0 | I1 || Value     ->    I0 | I1 || Value
---+----++-------          ---+----++-------
 0 |  0 ||   1              0 |  0 ||   1
   |  1 ||   2                |  1 ||   2
 1 |  0 ||   3              1 |  0 ||   3
 2 |  0 ||   5                |  1 ||   NaN
   |  1 ||   6              2 |  0 ||   5
 3 |  1 ||   8                |  1 ||   6
                            3 |  0 ||   NaN
                              |  1 ||   8

Вот кадр, чтобы примерить:

df = pd.DataFrame({'I0': [0,0,1,2,2,3], 'I1': [0,1,0,0,1,1], 'Value': [1,2,3,5,6,8]})
df = df.set_index(['I0', 'I1'])

Чтобы уточнить

У меня есть DataFrame в том виде, в котором индексы уже установлены. В лучшем случае я хотел бы иметь возможность манипулировать MultiIndex так, чтобы уровни не приходилось преобразовывать обратно в столбцы. Но я понимаю, если это требуется.

1 Ответ

0 голосов
/ 02 сентября 2018

Использование MultiIndex.from_product с Series.reindex:

df = pd.DataFrame({'I0': [0,0,1,2,2,3], 'I1': [0,1,0,0,1,1], 'Value': [1,2,3,5,6,8]})

mux = pd.MultiIndex.from_product([df['I0'].unique(), [0,1]], names=['I0','I1'])

mux = pd.MultiIndex.from_product([np.arange(df['I0'].max() + 1), 
                                  df['I1'].unique()], 
                                  names=['I0','I1'])

mux = pd.MultiIndex.from_product([df['I0'].unique(), df['I1'].unique()], names=['I0','I1'])
df = df.set_index(['I0', 'I1']).reindex(mux)

print (df)
       Value
I0 I1       
0  0     1.0
   1     2.0
1  0     3.0
   1     NaN
2  0     5.0
   1     6.0
3  0     NaN
   1     8.0

EDIT:

После того, как какое-то решение для обсуждения было изменено - чтобы сохранить другие уровни MultiIndex, сначала необходимо преобразовать уровни в целые числа (чтобы избежать сортировки в виде строк), а затем использовать unstack с stack. Для сохранения NaN s используйте параметр dropna=False:

a = df.index.get_level_values(0).astype(int)
b = df.index.get_level_values(1).astype(int)
c = df.index.get_level_values(2)   # String index level
d = df.index.get_level_values(3).astype(int)

df.index = pd.MultiIndex.from_arrays([a, b, c, d], names=df.index.names)

df = df.unstack().stack(dropna=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...