Иерархический индекс от pd dataframe до Excel, необходимо перенаправить заполнить и удалить - PullRequest
0 голосов
/ 03 января 2019

У меня есть фрейм данных pandas с трехуровневым иерархическим индексом, созданный следующим образом: df_grouped = df.groupby(['Country','Description', pd.Grouper(freq = 'M')]).sum()

По сути, это таблица, где Страна - это самый высокий уровень, а Описание - это второй уровень, за которым следует дата, сгруппированная по месяцам.

КАРТИНА A

Here is a sample after exporting to excel:

Я бы хотел сделать две несвязанные вещи:

Удалите все иерархические индексы в этой структуре в python, затем выполните прямую заливку, чтобы создать КАРТИНУ B.

КАРТИНА B

enter image description here

Иметь возможность преобразовывать дату и время в иерархической структуре PICTURE A в YYYY-MM в python, поэтому при экспорте я получаю PICTURE C. (Я понимаю, что могу сделать это из структуры в PICTURE B, я просто хочу иметь возможность делать это, пока оно все еще находится в иерархической структуре в фрейме данных pandas).

ФОТО C

enter image description here

Какие-нибудь советы?

1 Ответ

0 голосов
/ 03 января 2019

После groupby вы получаете MultiIndex DataFrame, поэтому значения перерисовываются на первом и втором уровне, только не отображаются.

Если второй DataFrame не нужен, вы можете преобразовать DatetimeIndex в YYYY-MM формат strftime или в месячный период to_period:

df_grouped = df.groupby(['Country','Description', df.index.strftime('%Y-%m')]).sum()

Или:

df_grouped = df.groupby(['Country','Description', df.index.to_period('m')]).sum()

При необходимости второй DataFrame добавить reset_index для преобразования уровней в столбцы и для преобразования второго уровня MultiIndex.set_levels с get_level_values:

df_grouped = df.groupby(['Country','Description', pd.Grouper(freq = 'M')]).sum()

df = df_grouped.reset_index()

idx = df_grouped.index.get_level_values(2).strftime('%Y-%m')
df_grouped.index = df_grouped.index.set_levels(idx, level=2)

Sample

rng = pd.date_range('2017-04-03', periods=10, freq='10D')
df = pd.DataFrame({'Country': ['Country'] * 10,
                   'Description':['A'] * 3 + ['B'] * 3 + ['C'] * 4, 
                   'a': range(10)}, index=rng)  
print (df)
            Country Description  a
2017-04-03  Country           A  0
2017-04-13  Country           A  1
2017-04-23  Country           A  2
2017-05-03  Country           B  3
2017-05-13  Country           B  4
2017-05-23  Country           B  5
2017-06-02  Country           C  6
2017-06-12  Country           C  7
2017-06-22  Country           C  8
2017-07-02  Country           C  9

df_grouped = df.groupby(['Country','Description', pd.Grouper(freq = 'M')]).sum()
print (df_grouped)
                                 a
Country Description               
Country A           2017-04-30   3
        B           2017-05-31  12
        C           2017-06-30  21
                    2017-07-31   9

df = df_grouped.reset_index().rename(columns={'level_2':'Date'})
print (df)
   Country Description       Date   a
0  Country           A 2017-04-30   3
1  Country           B 2017-05-31  12
2  Country           C 2017-06-30  21
3  Country           C 2017-07-31   9

idx = df_grouped.index.get_level_values(2).strftime('%Y-%m')
df_grouped.index = df_grouped.index.set_levels(idx, level=2)
print (df_grouped)
                              a
Country Description            
Country A           2017-04   3
        B           2017-05  12
        C           2017-06  21
                    2017-07   9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...