python - проценты, сгруппированные по мультииндексам - PullRequest
0 голосов
/ 10 июля 2020

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

{(Period('2020-01', 'M'), False): 213,
 (Period('2020-01', 'M'), True): 21,
 (Period('2020-02', 'M'), False): 313,
 (Period('2020-02', 'M'), True): 13,
 (Period('2020-03', 'M'), False): 213,
 (Period('2020-03', 'M'), True): 23,
 (Period('2020-04', 'M'), False): 213,
 (Period('2020-04', 'M'), True): 12,
 (Period('2020-05', 'M'), False): 321,
 (Period('2020-05', 'M'), True): 121,
 (Period('2020-06', 'M'), False): 321,
 (Period('2020-06', 'M'), True): 22,
 (Period('2020-07', 'M'), False): 333,
 (Period('2020-07', 'M'), True): 11}

Я пытаюсь создать второй столбец с процентами, сгруппированными за месяц (уровень индекса = 0). Я до сих пор достиг этого:

df["new_column"] = df.groupby(level=0).apply(lambda x: x/sum(x))

Ошибка:

DateParseError: Unknown datetime string format, unable to parse: new_columns

Кажется, что groupby не может распознать формат даты при присвоении процентов new_column. Почему?

1 Ответ

0 голосов
/ 10 июля 2020

Я думаю, вам просто нужно добавить [0] после того, как вы укажете уровень в своей группе.

df['new column'] = df.groupby(level=0)[0].apply(lambda x:x/sum(x))

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

dictionary = ({(pd.Period('2020-01', 'M'), False): 213,
(pd.Period('2020-01', 'M'), True): 21,
(pd.Period('2020-02', 'M'), False): 313,
(pd.Period('2020-02', 'M'), True): 13,
(pd.Period('2020-03', 'M'), False): 213,
(pd.Period('2020-03', 'M'), True): 23,
(pd.Period('2020-04', 'M'), False): 213,
(pd.Period('2020-04', 'M'), True): 12,
(pd.Period('2020-05', 'M'), False): 321,
(pd.Period('2020-05', 'M'), True): 121,
(pd.Period('2020-06', 'M'), False): 321,
(pd.Period('2020-06', 'M'), True): 22,
(pd.Period('2020-07', 'M'), False): 333,
(pd.Period('2020-07', 'M'), True): 11})

df = pd.DataFrame(pd.Series(dictionary))

df['new column'] = df.groupby(level=0)[0].apply(lambda x:x/sum(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...