0

Создание пустого MultiIndex

13

Я хотел бы создать пустой DataFrame с MultiIndex перед тем, как добавить в него строки. Я обнаружил, что пустые DataFrame не поддерживают назначение MultiIndex на лету, поэтому я устанавливаю имена для MultiIndex во время создания. Однако я не хочу задавать уровни, так как это будет сделано позже. Вот мой код на данный момент:

def empty_multiindex(names):
    """
    Создает пустой MultiIndex из списка имен уровней.
    """
    return MultiIndex.from_tuples(tuples=[(None,) * len(names)], names=names)

Этот код выдает следующий результат:

In [2]:
empty_multiindex(['one', 'two', 'three'])

Out[2]:
MultiIndex(levels=[[], [], []],
           labels=[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]],
           names=[u'one', u'two', u'three'])

И:

In [3]:
DataFrame(index=empty_multiindex(['one', 'two', 'three']))

Out[3]:
one two three
NaN NaN NaN

Как видно, я получаю NaN, которые мне не нужны. Я могу легко удалить их позже, но это явно не самое лучшее решение. Может, кто-то знает более хороший способ?

4 ответ(ов)

0

Решение состоит в том, чтобы не указывать метки. Это отлично работает для меня:

>>> import pandas as pd
>>> my_index = pd.MultiIndex(levels=[[],[],[]],
...                          codes=[[],[],[]],
...                          names=[u'one', u'two', u'three'])
>>> my_index
MultiIndex([], names=['one', 'two', 'three'])
>>> my_columns = [u'alpha', u'beta']
>>> df = pd.DataFrame(index=my_index, columns=my_columns)
>>> df
Empty DataFrame
Columns: [alpha, beta]
Index: []
>>> df.loc[('apple','banana','cherry'),:] = [0.1, 0.2]
>>> df
                    alpha beta
one   two    three
apple banana cherry   0.1  0.2

Для версий Pandas < 0.25.1: Можно использовать ключевое слово labels вместо codes.

0

Еще одно решение, которое, возможно, немного проще, — это использовать функцию set_index:

>>> import pandas as pd
>>> df = pd.DataFrame(columns=['one', 'two', 'three', 'alpha', 'beta'])
>>> df = df.set_index(['one', 'two', 'three'])
>>> df
Empty DataFrame
Columns: [alpha, beta]
Index: []
>>> df.loc[('apple', 'banana', 'cherry'), :] = [0.1, 0.2]
>>> df
                    alpha beta
one   two    three            
apple banana cherry   0.1  0.2

Сначала создается DataFrame с нужными колонками, затем с помощью метода set_index устанавливаются несколько колонок в качестве индекса. После этого можно добавлять данные по этому индексу. В приведенном примере мы добавили строку с индексом ('apple', 'banana', 'cherry'), и соответствующие значения для колонок alpha и beta были успешно добавлены.

0

Использование pd.MultiIndex.from_tuples может быть более простым подходом. Вот пример:

import pandas as pd

# Создаем многомерный индекс с именами уровней
ind = pd.MultiIndex.from_tuples([], names=(u'one', u'two', u'three'))

# Создаем DataFrame с определенными колонками и индексом
df = pd.DataFrame(columns=['alpha', 'beta'], index=ind)

# Добавляем данные в DataFrame
df.loc[('apple', 'banana', 'cherry'), :] = [4, 3]

# Выводим DataFrame
df

Результат будет выглядеть так:

                      alpha beta
one     two     three       
apple   banana  cherry    4    3

Этот метод позволяет явно задавать уровни индексов и упрощает работу с данными в будущем.

0

Использование pd.MultiIndex.from_arrays позволяет более лаконично определить индекс при его явном указании:

import pandas as pd

ind = pd.MultiIndex.from_arrays([[]] * 3, names=(u'one', u'two', u'three'))
df = pd.DataFrame(columns=['alpha', 'beta'], index=ind)
df.loc[('apple','banana','cherry'), :] = [4, 3]

                     alpha  beta
one   two    three              
apple banana cherry      4     3

В этом примере мы создаем многомерный индекс с помощью MultiIndex.from_arrays, задавая имена для уровней индекса. Затем мы создаем DataFrame с двумя столбцами и используем созданный индекс. После этого мы можем легко установить значения для конкретной комбинации индексов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь