MultiIndex Pivot в пандах, проблема длинного-широкого - PullRequest
0 голосов
/ 03 января 2019

У меня есть, я уверен, простая просторная проблема, но я не могу понять синтаксис, как справиться с этим, когда у меня в игре несколько столбцов.

Мои данные выглядят так:

>>> df.head()
        s_name   geo    zip  date value
0        A002X   zip  00601  2010     1
1        A002Y   zip  00601  2010     2
2        A003X   zip  00601  2010     3
3        A003Y   zip  00601  2010     4
...
.        A002X   zip  00602  2010     8
.        A002Y   zip  00602  2010     9
.        A003X   zip  00602  2010    10
.        A003Y   zip  00602  2010    11

Мне бы хотелось, чтобы это выглядело следующим образом, то есть содержимое столбца s_name становится новым столбцом, а их значения - столбцом 'value', сгруппированным по (geo, zip, date):

>>> df2.head()
         A002X A002Y A003X A003Y     geo    zip  date
0            1     2     3     4     zip  00601  2010
1            8     9    10    11     zip  00602  2010
2           19    20    21    22     zip  00603  2010
3           31    32    33    45     zip  00604  2010

Я пробовал пару таких вот

>>> df.pivot(columns='s_name', values=["geo","zip","date","value"])

>>> df.pivot(columns='s_name', values=["geo","zip","date","value"]).unstack().reset_index()

Я чувствую, что я действительно близко, но, похоже, ничего не подходит.Это, например, отбрасывает дополнительные значения не-s_name:

>>> df.pivot(columns='name', values=["value"]).head()

Как получить формат, который я ищу?

Ответы [ 2 ]

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

Что я буду делать pivot_table

s=df.pivot_table(index=['geo','zip','date'],columns='s_name',values='value',aggfunc='sum')
s
s_name        A002X  A002Y  A003X  A003Y
geo zip date                            
zip 601 2010      1      2      3      4
    602 2010      8      9     10     11
#s=s.reset_index()
0 голосов
/ 03 января 2019

Необходимо установить размеры в виде индексов и снять размерность, которая требуется в качестве столбцов.

В результате в конечном выводе останется многоиндексный индекс

Пример:

# with df as the following
  s_name  geo  zip  date  value
0  A002X  zip  601  2010      1
1  A002Y  zip  601  2010      2
2  A003X  zip  601  2010      3
3  A003Y  zip  601  2010      4

ids = df.columns[:-1].tolist()
df2 = df.set_index(ids).unstack(0)
df2
# outputs:
             value                  
s_name       A002X A002Y A003X A003Y
geo zip date                        
zip 601 2010     1     2     3     4

Затем сгладить мультииндекс, сохранив 2-й уровень:

df2.columns = df2.columns.get_level_values(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...