Установить мультииндексные значения DataFrame для каждого внутреннего DataFrame - PullRequest
1 голос
/ 25 апреля 2020

У меня есть (очень) большой мультииндексированный фрейм данных с одним логическим столбцом. например:

bool_arr = np.random.randn(30)<0
df = pd.concat(3*[pd.DataFrame(np.random.randn(10, 3), columns=['A','B','C'])],
           keys=np.array(['one', 'two', 'three']))
df['bool'] = bool_arr
df.index.rename(['Ind1', 'Ind2'], inplace=True)

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

Я могу сделать это, перебирая каждый уровень индекса, извлекая внутренние кадры данных один за другим и сбрасывая соответствующие значения, затем подключая новую серию обратно к копии исходного кадра данных. Но это очень расточительно как во времени, так и в памяти.
Есть ли более быстрый способ сделать это?
(Я должен добавить, что в моем примере все внутренние кадры данных имеют одинаковую длину, но это не обязательно так для меня)

1 Ответ

1 голос
/ 26 апреля 2020

вы можете groupby.transform столбец 'bool', чтобы получить третье значение с nth, затем получить intersection с индексом первых двух элементов с head (последние 2 элемента tail) на группу. Затем вы можете loc union индекса установить на False:

# used per group action several times
gr = df.groupby(level=0)

# get the third value per group
s1 = gr['bool'].transform('nth',2)
# intersection of index with False at 3rd position per group 
# and index of first 2 rows per group
index_head = df.index[~s1].intersection(gr.head(2).index)

# get the last third value per group
s2 = gr['bool'].transform('nth', -3) #note -3 and not -2
# same idea but with tail
index_tail = df.index[~s2].intersection(gr.tail(2).index)

# loc the union of all the index to change
df.loc[index_head.union(index_tail), 'bool'] = False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...