Выбор ячеек в мультииндексных фреймах Pandas с использованием списка - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь установить значения определенных ячеек в мультидексном фрейме Pandas MultiIndex, выбрав эти ячейки с помощью списка.

Обратите внимание на последовательность обоих списков.

df.loc[(['Peter','John','Tom'],'AAPL'),1] = ['Peter', 'John', 'Tom']

Проблема: Однако значения устанавливаются в неправильную ячейку. Например, я ожидаю, что значение Peter будет установлено под индексом Peter, но оно устанавливается под Tom!

Каждый знает причину, и как это правильно сделать. ?

Другими словами, как мы можем обеспечить, чтобы последовательность списка, используемого в df.loc() (например: ['Peter','John','Tom'] внутри df.loc), была такой же последовательностью, что и список значений (например: ['Peter','John','Tom'] справа от =)

Ожидаемый результат

             0      1   2
Name  Stock              
Tom   AAPL   0    Tom   0
      GOOG   0      0   0
      NFLX   0      0   0
John  AAPL   0   John   0
      GOOG   0      0   0
      NFLX   0      0   0
Peter AAPL   0  Peter   0
      GOOG   0      0  46
      NFLX   0      0   0

Фактический результат

             0      1   2
Name  Stock              
Tom   AAPL   0  Peter   0   <----- should be Tom
      GOOG   0      0   0
      NFLX   0      0   0
John  AAPL   0   John   0
      GOOG   0      0   0
      NFLX   0      0   0
Peter AAPL   0    Tom   0   <----- should be Peter
      GOOG   0      0  46
      NFLX   0      0   0

Код для воспроизведения проблемы

import pandas as pd

# Initialize MultiIndex DataFrame
stocks = ['AAPL', 'GOOG', 'NFLX']
names = ['Tom', 'John', 'Peter']
midx = pd.MultiIndex.from_product([names, stocks], names=['Name','Stock'])
df = pd.DataFrame(index=midx, columns=[0,1,2])
df.loc[pd.IndexSlice[:,:],:] = 0

# Partially populate the empty MultiIndex DataFrame
df.loc[('Tom', 'AAPL'), 1] = 36
df.loc[('Peter', 'GOOG'), 2] = 46
print(df)  # looks correct
# Set values for some cells
df.loc[(['Peter','John','Tom'],'AAPL'),1] = ['Peter', 'John', 'Tom']
print(df)  # wrong!!!

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Хотя я не знаю, что является причиной проблемы, ее можно обойти, если быть точнее с многоиндексированными данными.

df.loc[[('Peter','AAPL'),('John','AAPL'),('Tom','AAPL')],1] = ['Peter','John','Tom']
print(df) # this one works as you would expect

# to make it a bit more automated (create index from list, set 1st column to appropriate list item
# name list:
pjt = ['Peter','John','Tom']
# index list built from name list
pjt_aapl = [ (name,'AAPL') for name in ['Peter','John','Tom'] ]
# set first column to name
df.loc[ pjt_aapl, 1] = pjt

Приветствия, Джесси

1 голос
/ 15 октября 2019

Подобным образом, предоставляя полный индекс для каждого элемента.

df.loc[[('Peter', 'AAPL'), ('John', 'AAPL'),('Tom','AAPL')],1] = ['Peter', 'John', 'Tom']
print(df)

Документация передних панд

Примечание Важно отметить, что кортежии списки не обрабатываются одинаково в пандах, когда дело доходит до индексации. В то время как кортеж интерпретируется как один многоуровневый ключ, список используется для указания нескольких ключей. Или, другими словами, кортежи идут горизонтально (уровни обхода), списки идут вертикально (уровни сканирования).

...