2016-02-23 3 views
3

Я искал много, много других сообщений SO для ответа на этот вопрос, но не нашел совершенно того, что я ищу. Здесь идет:Как создать сводную таблицу уникальных значений?

Допустим, у нас есть dataframe который выглядит следующим образом:

In [7]: df.head(5) 
Out[7]: 
    bool_flag group int_flag 
0  False bottom   0 
1  False  mid   1 
2  False  top   1 
3  False  top   0 
4  False high   1 

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

    bottom low mid high top 
bool_flag true  5  32 2 12 4 
      false  2  42 7  2 10 
int_flag  0  1  10 15  3 8 
       1  10  31 14  0 1 

суммируя число уникальных значений каждого из столбцов, не являющихся group и сгруппированы в столбцах group.

Я подошел. Следующая команда pivot_table получит мне таблицы, которые напоминают компоненты того, что я хотел бы иметь.

In [8]: pd.pivot_table(df.drop('bool_flag', axis=1), columns=['group'], index=['int_flag'], aggfunc=len) 
Out[8]: 
group  bottom high low mid top 
int_flag 
0    15 11 8 13 13 
1    12  5 8 9 6 


In [9]: pd.pivot_table(df.drop('int_flag', axis=1), columns=['group'], index=['bool_flag'], aggfunc=len) 
Out[9]: 
group  bottom high low mid top 
bool_flag 
False   19 14 15 18 16 
True   8  2 1 4 3 

Однако index результирующей таблицы не Multiindex Я хотел бы иметь, и, таким образом, делает конкатенации эту сводную таблицу с тем же для bool_flag более сложной.

Я надеюсь, что есть способ либо использовать groupby, либо pivot_table, чтобы получить то, что я хочу, не создавая эти подтаблицы и не конкатенируя их, но до сих пор я не смог его найти. Поворотный с несколькими столбцами индекса приводит к слишком мелкозернистым таблицам (я не хочу, чтобы кол-(False, 0) пара для (bool_flag, int_flag) значений, например, только счет каждое уникального значения в пределах каждого group.)

Я также попытался использовать groupby('group').agg(f), где я определил f, чтобы получить результат звонка value_counts() для каждой серии. Однако agg несовместим с функциями, которые возвращают DataFrame s.

Любые предложения были бы высоко оценены!

+0

Кто-то спросил, есть ли 'df.groupby (['bool_flag', 'group', 'int_flag']). Size(). Unstack (1)' будет работать, но удалил их комментарий. К сожалению, это не сработало - обратите внимание, что значения не те, что я создал с примерами сводной таблицы. Я упомянул, что не хотел, чтобы подсчеты отображали уникальное значение _pairs_. Вместо этого мне просто нужна перекрестная закладка 'group' vs.' bool_flag' и 'group' vs.' int_flag', расположенных сверху друг на друга. – silver

+0

Я сам не буду редактировать его, но я думаю, что более точным заголовком для вопроса может быть «как соединить/добавить две сводные таблицы с разными индексами» или что-то в этом роде, хотя этот конкретный заголовок может быть не очень улучшения. ;-) Самая сложная проблема здесь ИМО действительно имеет отношение к concat/добавлению индексов, которые не выстраиваются в линию, более того, чем создание единой сводной таблицы. – JohnE

ответ

2

На самом деле, я не думаю, что то, о чем я прошу, возможно. Настройка индексов двух сводных таблиц я показал выше MultiIndex с, выполнив следующие действия:

x = pd.pivot_table(df.drop('int_flag', axis=1), columns=['group'], index=['bool_flag'], aggfunc=len) 
y = pd.pivot_table(df.drop('bool_flag', axis=1), columns=['group'], index=['int_flag'], aggfunc=len) 

def multiindex_from_pivot_result(df): 
    return pd.MultiIndex.from_tuples([(df.index.name, val) for val in df.index], names=['feature', 'values']) 

xx = x.set_index(multiindex_from_pivot_result(x)) 
yy = y.set_index(multiindex_from_pivot_result(y)) 

результаты через таблицы, которые выглядят следующим образом:

group    bottom high low mid top 
feature values 
bool_flag False  19 14 15 18 16 
      True   8  2 1 4 3 

и

group   bottom high low mid top 
feature values 
int_flag 0   15 11 8 13 13 
     1   12  5 8 9 6 

однако их конкатенирование таким образом

pd.concat([yy, xx]) 

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

In [24]: pd.concat([yy, xx]) 
Out[24]: 
group    bottom high low mid top 
feature values 
int_flag 0   15 11 8 13 13 
      1   12  5 8 9 6 
bool_flag 0   19 14 15 18 16 
      1   8  2 1 4 3 

К сожалению, это оставляет меня с выбором сброса, что уровень индекса до нормального столбца, который не печатает, как красиво.

Надеюсь, это помогло кому-то!