Python pandas создание неравномерного мультииндекса - PullRequest
5 голосов
/ 01 августа 2020

У меня есть следующий код

IDX_VALS_BANKNOTER_PATRIMONY = [['PATRIMONY'],['GOLD']]
IDX_VALS_BANKNOTER_ASSETS = [['ASSETS'],['DEPOSITS', 'ADVANCES']]
IDX_VALS_BANKNOTER_LIABILITIES = [['LIABILITIES'], ['CLIENTS', 'SUPPLIERS']]

IDX_BANKNOTER_PATRIMONY = pd.MultiIndex.from_product(IDX_VALS_BANKNOTER_PATRIMONY)
IDX_BANKNOTER_ASSETS = pd.MultiIndex.from_product(IDX_VALS_BANKNOTER_ASSETS)
IDX_BANKNOTER_LIABILITIES = pd.MultiIndex.from_product(IDX_VALS_BANKNOTER_LIABILITIES)

IDX_BANKNOTER = IDX_BANKNOTER_PATRIMONY.append(IDX_BANKNOTER_ASSETS).append(IDX_BANKNOTER_LIABILITIES)

print(IDX_BANKNOTER)

, который печатает следующий индекс:

MultiIndex([(  'PATRIMONY',      'GOLD'),
            (     'ASSETS',  'DEPOSITS'),
            (     'ASSETS',  'ADVANCES'),
            ('LIABILITIES',   'CLIENTS'),
            ('LIABILITIES', 'SUPPLIERS')],
           )

(я использовал .from_product(), потому что надеюсь в конечном итоге добавить больше ярлыков) Мой вопрос следующее: я хочу расширить этот мультииндекс на третий столбец, чтобы я получил мультииндекс, который выглядит так:

'PATRIMONY', 'GOLD',
'ASSETS', 'DEPOSITS',
'ASSETS', 'ADVANCES',
'LIABILITIES', 'CLIENTS', 'Dr. Foo'
'LIABILITIES', 'CLIENTS', 'Dr. House'
'LIABILITIES', 'CLIENTS', 'Richard'
'LIABILITIES', 'SUPPLIERS', 'PORT1',
'LIABILITIES', 'SUPPLIERS', 'PORT2'

, что будет означать, что мультииндекс будет неравномерным, с использованием только третьего уровня «ОБЯЗАТЕЛЬСТВА» и отдельные индексы для КЛИЕНТОВ и ПОСТАВЩИКОВ в соответствии с именем клиента или именем поставщика. Я пробовал добавить следующие индексы:

IDX_FIRST_EXTENSION_NAMES = [['LIABILITIES'], ['CLIENTS'], ['Dr. Foo', 'Dr. House', 'Richard']]
IDX_FIRST_EXTENSION = pd.MultiIndex.from_product(IDX_FIRST_EXTENSION_NAMES)
IDX_SECOND_EXTENSION_NAMES = [['LIABILITIES'], ['SUPPLIERS'], ['PORT1', 'PORT2']]
IDX_SECOND_EXTENSION = pd.MultiIndex.from_product(IDX_SECOND_EXTENSION_NAMES)
DESIRED_RESULT = IDX_BANKNOTER.append(IDX_FIRST_EXTENSION).append(IDX_SECOND_EXTENSION)

, но все, что я получаю взамен:

MultiIndex([(  'PATRIMONY',      'GOLD'),
            (     'ASSETS',  'DEPOSITS'),
            (     'ASSETS',  'ADVANCES'),
            ('LIABILITIES',   'CLIENTS'),
            ('LIABILITIES',   'CLIENTS'),
            ('LIABILITIES',   'CLIENTS'),
            ('LIABILITIES', 'SUPPLIERS'),
            ('LIABILITIES', 'SUPPLIERS')],
           )

Я новичок в использовании pandas, а документация по мультииндексам не имеет Это не помогло (у него довольно ограниченное количество примеров инициализации мультииндексов, и нет примеров неравномерного мультииндекса). У кого-нибудь есть указатели? Я делаю этот мультииндекс, чтобы легко манипулировать соответствующими данными, например, имея возможность получить доступ к определенной учетной записи клиента c с помощью

df['LIABILITIES']['CLIENTS']['(CLIENT NAME)']

или получить сумму всех значений ниже ['CLIENTS']. В идеале я хотел бы сохранить столбцы фрейма данных для меток времени.

Любая помощь приветствуется, спасибо.

1 Ответ

1 голос
/ 01 августа 2020

код:

import pandas as pd

IDX_VALS_BANKNOTER_PATRIMONY = [['PATRIMONY'],['GOLD'], ['']]
IDX_VALS_BANKNOTER_ASSETS = [['ASSETS'],['DEPOSITS', 'ADVANCES'], ['']]

IDX_BANKNOTER_PATRIMONY = pd.MultiIndex.from_product(IDX_VALS_BANKNOTER_PATRIMONY)
IDX_BANKNOTER_ASSETS = pd.MultiIndex.from_product(IDX_VALS_BANKNOTER_ASSETS)

IDX_BANKNOTER = IDX_BANKNOTER_PATRIMONY.append(IDX_BANKNOTER_ASSETS)

IDX_FIRST_EXTENSION_NAMES = [['LIABILITIES'], ['CLIENTS'], ['Dr. Foo', 'Dr. House', 'Richard']]
IDX_FIRST_EXTENSION = pd.MultiIndex.from_product(IDX_FIRST_EXTENSION_NAMES)
IDX_SECOND_EXTENSION_NAMES = [['LIABILITIES'], ['SUPPLIERS'], ['PORT1', 'PORT2']]
IDX_SECOND_EXTENSION = pd.MultiIndex.from_product(IDX_SECOND_EXTENSION_NAMES)
WANTED_RESULT = IDX_BANKNOTER.append(IDX_FIRST_EXTENSION).append(IDX_SECOND_EXTENSION)

print(WANTED_RESULT)

вывод:

MultiIndex([(  'PATRIMONY',      'GOLD',          ''),
            (     'ASSETS',  'DEPOSITS',          ''),
            (     'ASSETS',  'ADVANCES',          ''),
            ('LIABILITIES',   'CLIENTS',   'Dr. Foo'),
            ('LIABILITIES',   'CLIENTS', 'Dr. House'),
            ('LIABILITIES',   'CLIENTS',   'Richard'),
            ('LIABILITIES', 'SUPPLIERS',     'PORT1'),
            ('LIABILITIES', 'SUPPLIERS',     'PORT2')],
           )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...