создать pandas pivottable с длинным мультииндексом - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть датафрейм df с формой (4573,64), которую я пытаюсь развернуть. Последний столбец является идентификатором с двумя возможными строковыми значениями «старый» и «новый». Я хотел бы установить первые 63 столбца в качестве индекса, а затем столбец «id» в верхней части со значениями, равными количеству «старых» или «новых» для каждой строки индекса. Я создал объект списка из меток столбцов, которые я хочу использовать в качестве индекса с именем cols.

Я попробовал следующее:

df.pivot(index=cols, columns='id')['id']

это выдает ошибку: «все массивы должны быть одинаковой длины» также попробовал следующее, чтобы узнать, смогу ли я получить сумму, но также не повезло:

pd.pivot_table(df,index=cols,values=['id'],aggfunc=np.sum)

Любые иды с благодарностью

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я нашел в сети тему, рассказывающую о возможной ошибке в pandas 0.23.0, когда pandas.pivot_table () не будет принимать мультииндекс, если он содержит NaN (ссылка на github в комментариях). Мой обходной путь должен был сделать

df.fillna('empty', inplace=True)

тогда решение ниже:

df1 = pd.pivot_table(df, index=cols,columns='id',aggfunc='size', fill_value=0)

в соответствии с предложением jezrael будет работать так, как задумано, поэтому ответ принят.

0 голосов
/ 05 сентября 2018

Мне кажется, нужно преобразовать имена столбцов в список, а затем агрегировать size с unstack:

df = pd.DataFrame({'B':[4,4,4,5,5,4],
                   'C':[1,1,9,4,2,3],
                   'D':[1,1,5,7,1,0],
                   'E':[0,0,6,9,2,4],
                   'id':list('aaabbb')})

print (df)
   B  C  D  E id
0  4  1  1  0  a
1  4  1  1  0  a
2  4  9  5  6  a
3  5  4  7  9  b
4  5  2  1  2  b
5  4  3  0  4  b

cols = df.columns.tolist()
df1 = df.groupby(cols)['id'].size().unstack(fill_value=0)
print (df1)
id       a  b
B C D E      
4 1 1 0  2  0
  3 0 4  0  1
  9 5 6  1  0
5 2 1 2  0  1
  4 7 9  0  1

Решение с pivot_table:

df1 = pd.pivot_table(df, index=cols,columns='id',aggfunc='size', fill_value=0)
print (df1)
id       a  b
B C D E      
4 1 1 0  2  0
  3 0 4  0  1
  9 5 6  1  0
5 2 1 2  0  1
  4 7 9  0  1
...