Установить индекс серии в другой индекс с большим количеством уровней - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь установить индекс Series (a1) с индексом (ix), который содержит больше уровней, чем первоначальный индекс серии.

>>> a = pd.DataFrame({'a': [1, 2, 3], 'b': ['b', 'b', 'b'], 'x': [4, 5, 6]}).set_index(['a', 'b'])
>>> a
     x
a b   
1 b  4
2 b  5
3 b  6
>>> 
>>> a1 = a['x']
>>> a1
a  b
1  b    4
2  b    5
3  b    6
Name: x, dtype: int64

>>> ix = pd.MultiIndex.from_product(([1, 2, 3], ['b', 'c'], [10, 20]), names=['a', 'b', 'c'])
>>> ix
MultiIndex(levels=[[1, 2, 3], [u'b', u'c'], [10, 20]],
           labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]],
           names=[u'a', u'b', u'c'])
>>> a.set_index(ix)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "python2.7/site-packages/pandas/core/frame.py", line 3164, in set_index
    frame.index = index
  File "python2.7/site-packages/pandas/core/generic.py", line 3627, in __setattr__
    return object.__setattr__(self, name, value)
  File "pandas/_libs/properties.pyx", line 69, in pandas._libs.properties.AxisProperty.__set__
  File "python2.7/site-packages/pandas/core/generic.py", line 559, in _set_axis
    self._data.set_axis(axis, labels)
  File "python2.7/site-packages/pandas/core/internals.py", line 3074, in set_axis
    (old_len, new_len))
ValueError: Length mismatch: Expected axis has 3 elements, new values have 12 elements

в результате я бы ожидал следующую серию:

a  b   c
1  b  10  4
2  b  10  5
3  b  10  6
1  c  10  nan   # [1, c] wasn't an index in a1
2  c  10  nan   # ...
3  c  10  nan   # ...
1  b  20  4     # [1, b] was an index of a1, so use that value
2  b  20  5     # ...
3  b  20  6     # ...
1  c  20  nan   # [1, c] wasn't an index in a1
2  c  20  nan   # ...
3  c  20  nan   # ...

# if there was an index in a1 that isn't in `ix`, it should be maintained with
# its value and the index should be augmented

Как мне достичь этого с помощью панд?

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Используйте Series.reindex, но вывод немного отличается, потому что MultiIndex отсортировано, что, очевидно, необходимо для эффективной работы позже - source :

Чтобы объекты с индексом MultiIndex были эффективно проиндексированы и разрезаны, их необходимо отсортировать. Как и с любым индексом, вы можете использовать sort_index ().

a = a.reindex(ix)
print (a)
          x
a b c      
1 b 10  4.0
    20  4.0
  c 10  NaN
    20  NaN
2 b 10  5.0
    20  5.0
  c 10  NaN
    20  NaN
3 b 10  6.0
    20  6.0
  c 10  NaN
    20  NaN
0 голосов
/ 15 мая 2019

Проблема в том, что у вас есть пустой фрейм данных, который имеет три столбца, и вы пытаетесь присвоить ему мультииндекс из двух столбцов;Если изначально создать пустой фрейм данных из четырех столбцов, ошибка исчезнет:

df = pd.DataFrame(pd.np.empty((0, 12)))    
df.columns = pd.MultiIndex(levels = [['first', 'second'], ['a', 'b']], labels = [[0, 0, 1, 1], [0, 1, 0, 1]])

Или вы можете создать пустой фрейм данных с мультииндексом следующим образом:

multi_index = pd.MultiIndex(levels = [['first', 'second'], ['a', 'b']], labels = [[0, 0, 1, 1], [0, 1, 0, 1]])    
df = pd.DataFrame(columns=multi_index)

df
#   first    second
#  a    b   a     b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...