Предположим, у меня есть DataFrame
, который выглядит как:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Week' : [1, 2, 1, 2, 1, 2, 1, 2],
'Rabbits' : np.random.randn(8),
'Donkeys' : np.random.randn(8) * 4,
'Mice' : np.random.randn(8) * 4})
, что делает df
:

Затем я хочу сгруппировать данные по дням и выполнить базовый corr
тест для каждого дня:
week_group = df.groupby('Week')
week_group = week_group[df.columns.difference(["Week"])]
week_cor = week_group.corr()
, что составляет week_cor
a MultiIndex
для 1-й недели и 2-й недели:

Итак, теперь я хочу сделать следующее: я хочу создать DataFrame
на основе "двух" DataFrame
с.Для уточнения: давайте рассматривать неделю 1 как df1
, а неделю 2 как df2
.Теперь давайте рассмотрим запись в df1
entry1
и запись в df2
, entry2
.Получившийся DataFrame
построен следующим образом:
def collapse(entry1, entry2):
if abs(entry1) >= 0.6 and abs(entry2) >= 0.6:
return 1
else:
return 0
Так что в этом случае я бы хотел что-то вроде:
Donkeys Mice Rabbits
Donkeys 1.000000 0.000000 0.000000
Mice 0.000000 1.000000 0.000000
Rabbits 0.000000 0.000000 1.000000
В Python я обычно выполняю reduce
вложенныйсписок, но он не работает:
from functools import reduce
def collapse(entry1, entry2):
if abs(entry1) >= 0.6 and abs(entry2) >= 0.6:
return 1
else:
return 0
reduce(collapse, week_cor)
Что дает:
TypeError: bad operand type for abs(): 'str'
Что имеет смысл, поскольку это своего рода массив со строковыми ключами.
Я мог бы неправильно понять цель pandas
, но мне кажется, что идея выполнения операции reduce
вдоль MultiIndex
была бы довольно распространенной, и что pandas
мог бы сделать это.Пожалуйста, исправьте меня, если я ошибаюсь в этом предположении, и если нет, то каков стандартный способ сокращения по MultiIndex
?
В целом: я беру один DataFrame
и группирую данные покакой-то момент времени.Затем я выполняю операцию (в этом примере corr
), чтобы получить MultiIndex
на основе времени.Я хочу «свернуть» или уменьшить MultiIndex
таким же образом, как reduce
список в Python.В результате я уменьшаю MultiIndex
до DataFrame
.