пересмотреть панд df в каждой группе - PullRequest
0 голосов
/ 01 июня 2018

У меня есть df с MultiIndex из (id, date), и я хотел бы сделать 2 вещи:

  1. преобразовать DateTimeIndex с именем date в PeriodIndex в каждой id группе

  2. resample частота от PeriodIndex до месячной с дневной

Мой текущий (не-работающий) метод состоит в том, чтобы (даже до преобразования в PeriodIndex):

df = pd.DataFrame(data = {"val": np.arange(30), 
                          "id": np.tile([1,2], 15),
                          "date": np.repeat(pd.date_range(start = "2000-01-01", periods = 15, name="date"), 2)
                         })

df = df.set_index(["id", "date"]).sort_index() 
df.groupby("id")["val"].resample(rule = "M", closed = "right", label = "right").apply(lambda x: np.sqrt(sum(x)/10))

Это приводит к:

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'MultiIndex'

Как правильно выполнить всю процедуру?Я немного озадачен тем, как думать о groupby: моя ментальная модель такова, что все, что следует за операцией groupby, получит только подкадр, соответствующий этой группе (то есть MultiIndex становится единичным индексом просто date в этой конкретной группе).Разве это не правильно?

1 Ответ

0 голосов
/ 01 июня 2018

Если необходимо использовать DataFrameGroupBy.resample DatetimeIndex установить до groupby, также apply не нужно, быстрее resample sum, затем разделить окончательный Series на 10а затем используйте np.sqrt:

df = df.set_index(["date"]).sort_index() 

df1 = (np.sqrt(df.groupby("id")["val"]
                 .resample(rule = "M", closed = "right", label = "right")
                 .sum()
                 .div(10)))

print (df1)
id  date      
1   2000-01-31    4.582576
2   2000-01-31    4.743416
Name: val, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...