Первое использование read_csv
для создания DataFrame
:
df = pd.to_csv('file.csv')
Затем нужно set_index
с unstack
:
df1 = df.set_index(['user_id','col'])['val'].unstack(fill_value=0)
print (df1)
col 1 2 3 4
user_id
8901 55 66 0 0
11501 77 0 88 99
Другое решение с pivot
, заменив NaN
на 0
по fillna
и последним броском к int
:
df1 = df.pivot(index='user_id', columns='col', values='val').fillna(0).astype(int)
print (df1)
col 1 2 3 4
user_id
8901 55 66 0 0
11501 77 0 88 99
Если получить сообщение об ошибке:
"ValueError: Index contains duplicate entries, cannot reshape"
Это означает, что у вас есть несколько дубликатов, поэтому быстрое решение является groupby
с unstack
и некоторые aggreagte функции, как mean
или sum
:
print (df.groupby(['user_id','col'])['val'].mean().unstack(fill_value=0))
col 1 2 3 4
user_id
8901 55 66 0 0
11501 77 0 88 99
Лучше это увидеть в немного изменился csv
:
print (df)
user_id col val
0 8901 1 55
1 8901 2 66
2 11501 1 77 > duplicates -> 11501 and 1
3 11501 1 151 > duplicates -> 11501 and 1
4 11501 3 88
5 11501 4 99
print (df.groupby(['user_id','col'])['val'].mean().unstack(fill_value=0))
col 1 2 3 4
user_id
8901 55 66 0 0
11501 114 0 88 99
На самом деле я думал, что у меня нет дубликатов, но выяснил, что у меня действительно есть ... Я не мог использовать «.mean», поскольку он является категориальным значением, но решил, е проблема сначала смотрит на отсортированную таблице, а затем просто держать последнюю запись ... затем применяя (большое!) решения .. который я до сих пор в полной мере понять ;-)
df.sort(columns=(['user_id','col'])) # optional for debugging
df.drop_duplicates(subset=['user_id','col'], keep='last', inplace=True)
df_table = df.set_index(['user_id','col'])['val'].unstack(fill_value=0)
Вау, это уже крутой подход, которого я не нашел за несколько дней! Проблема в том, что я получаю сообщение об ошибке при распаковке> «ValueError: Index содержит повторяющиеся записи, не может изменить форму» –
См. Обновленное решение, я пытаюсь объяснить проблему и получить решение. – jezrael
Отличное решение, которого я не мог найти за несколько дней! Большое спасибо! –