Создание пустого MultiIndex
Я хотел бы создать пустой 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 ответ(ов)
Решение состоит в том, чтобы не указывать метки. Это отлично работает для меня:
>>> 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
.
Еще одно решение, которое, возможно, немного проще, — это использовать функцию 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
были успешно добавлены.
Использование 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
Этот метод позволяет явно задавать уровни индексов и упрощает работу с данными в будущем.
Использование 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 с двумя столбцами и используем созданный индекс. После этого мы можем легко установить значения для конкретной комбинации индексов.
Преобразование вывода GroupBy с многоуровневым индексом в Series обратно в DataFrame в Pandas
Как развернуть иерархический индекс в столбцах
Как изменить порядок столбцов в DataFrame?
Установить значение для конкретной ячейки в DataFrame pandas с использованием индекса
Получить все ключи из объекта GroupBy в Pandas