Выбор определенного значения ячейки индекса в многоуровневом Dataframe - PullRequest
1 голос
/ 04 апреля 2020

У меня есть многоуровневый фрейм данных со следующей информацией:

A  B  123  1     value1      value2
      654  2     value3      value4
C  D  543  2     value1      value2
      999  2     value5      value7

Я хочу выбрать, например, только одно значение 123 или 654 или 543 et c (часть индекса), используя значения индекса A и B (или C и D). Значения A, B, C, D ограничены, поэтому их можно легко найти по списку в al oop. Но значения 123, 654 или 543 могут варьироваться в диапазоне от 0 до 20000, поэтому использование l oop делает его очень медленным.

Спасибо. Предоставление более подробной информации: я пытаюсь получить доступ к dataframe df (созданному вами в ответе) с помощью циклов. df - большой фрейм данных.

введите код здесь

# Dataframe df1 have 2 columns with with subset of values in level0 and      #level1 of df1.
for index1 in range(len(df1)):
   for index2 in range(len(df1)):
        # x, y will fetch particular value of level0 & level1 respectively
        x = df1.loc[(index1),'level0column']
        y = df1.loc[(index2),'level1column']
        # Trying to get values for level2 values
        for level2ids in range(20000):
            for level3ids in range(2):
           total1 =  df.loc[(x,y, level2ids,level3ids), 'value_x']
           ......

Хотите заменить нижнюю строку кода.

    # Trying to get values for level2 values

    for level2ids in range(20000):

Поскольку df - большой фрейм данных, и я выбирая значения level0 и level1 во время выполнения, я хотел как-то захотеть получить значение level2 также во время выполнения. Извлечение значения level2 для определенного значения level0 и level1 даст мне только список с очень меньшими значениями. Интересно, возможно это или нет, а также задаюсь вопросом, должен ли я прояснить свою проблему или нет.

1 Ответ

0 голосов
/ 04 апреля 2020

Если ваш фрейм данных выглядит следующим образом:

df = pd.DataFrame({'level0':['A','A','C','C'],
                   'level1':['B','B','D','D'],
                   'level2':[123,654,543,999],
                   'level3':[1,2,2,2],
                   'value_x':['value1','value3','value1','value5'],
                   'value_y':['value2','value4','value2','value7']})
# set the index
df.set_index(['level{}'.format(i) for i in range(4)], inplace=True)

, который возвращает:

                                value_x value_y
level0  level1  level2  level3      
  A       B      123       1    value1  value2
                 654       2    value3  value4
  C       D      543       2    value1  value2
                 999       2    value5  value7

Вы должны иметь возможность использовать механику индексирование на основе меток :

df.loc[('A','B',123,1),:]

, который возвращает:

value_x    value1
value_y    value2
Name: (A, B, 123, 1), dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...