Pandas Pivot, основанный на двух столбцах (мультииндекс) - PullRequest
0 голосов
/ 08 октября 2018

У меня есть DataFrame:

u_id    date        social_interaction_type_id  Total_Count
4       2018-08-19  4                           5
4       2018-08-24  2                           3
4       2018-08-21  1                           4

Я хочу повернуть DataFrame на основе u_id и даты.

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

u_id    date        4       2       1
4       2018-08-19  5       nan     nan
4       2018-08-24  nan     3       nan
4       2018-08-21  nan     nan     4               

моя попытка кода:

df.pivot(index = ['u_id','date'] , columns='social_interaction_type_id',values='Total_Count')

ошибка:

ValueError: Length of passed values is 8803, index implies 1

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

pd.DataFrame.pivot по неизвестным мне причинам не работает со списком значений для index.Согласно документам, необязательный index должен быть строкой или объектом .Обходной путь должен использовать pd.DataFrame.pivot_table с aggfunc='first':

res = df.pivot_table(index=['u_id', 'date'], columns='social_interaction_type_id',
                     values='Total_Count', aggfunc='first').reset_index()

print(res)

social_interaction_type_id  u_id        date    1    2    4
0                              4  2018-08-19  NaN  NaN  5.0
1                              4  2018-08-21  4.0  NaN  NaN
2                              4  2018-08-24  NaN  3.0  NaN
0 голосов
/ 08 октября 2018

Используйте альтернативное решение с set_index и unstack:

df = (df.set_index(['u_id','date','social_interaction_type_id'])['Total_Count']
       .unstack()
       .reset_index()
       .rename_axis(None, axis=1))
print (df)
   u_id        date    1    2    4
0     4  2018-08-19  NaN  NaN  5.0
1     4  2018-08-21  4.0  NaN  NaN
2     4  2018-08-24  NaN  3.0  NaN

Если необходимо дублирование в первых 2 столбцах, используйте функцию агрегирования meansum нравится:

print (df)
   u_id        date  social_interaction_type_id  Total_Count
0     4  2018-08-19                           4            5 <- 4  2018-08-19 
1     4  2018-08-19                           6            4 <- 4  2018-08-19 
2     4  2018-08-24                           2            3
3     4  2018-08-21                           1            4


df2 = (df.groupby(['u_id','date','social_interaction_type_id'])['Total_Count']
       .mean() 
       .unstack()
       .reset_index()
       .rename_axis(None, axis=1))

Или:

df2 = (df.pivot_table(index=['u_id','date'],columns='social_interaction_type_id', values='Total_Count')
       .reset_index()
       .rename_axis(None, axis=1))

print (df2)
   u_id        date    1    2    4    6
0     4  2018-08-19  NaN  NaN  5.0  4.0
1     4  2018-08-21  4.0  NaN  NaN  NaN
2     4  2018-08-24  NaN  3.0  NaN  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...