#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных pandas. Как я могу преобразовать первый фрейм данных во второй?
Он попробовал следующее, но продолжает выбрасывать Index contains duplicate entries, cannot reshape
res_df = book_df.pivot(index='book_id', columns='field', values='field_value')
, я думаю, это происходит потому book_id=1
, что имеет несколько title
значений (X и Y). Я хотел бы разделить эти случаи запятыми.
Ввод
| id | book_id | field | field_value |
|----|---------|--------|--------------|
| 1 | 1 | title | X |
| 2 | 1 | title | Y |
| 3 | 1 | bsn | 999 |
| 4 | 2 | title | Harry Potter |
| 5 | 3 | title | Hello World |
| 6 | 3 | author | John Doe |
Ожидаемый результат
| id | book_id | title | bsn | author |
|----|---------|--------------|-----|----------|
| 1 | 1 | X,Y | 999 | |
| 2 | 2 | Harry Potter | | |
| 3 | 3 | Hello World | | John Doe |
Комментарии:
1. что происходит с id
4,5,6
??2. Пожалуйста, игнорируйте ‘id’. Речь идет о других столбцах…
Ответ №1:
Ваш свод был почти правильным. Я использовал pivot_table
и добавил строковое соединение с aggfunc
аргументом
(book_df.pivot_table(index='book_id', columns='field', values='field_value', aggfunc=','.join, fill_value='')
.reset_index()
.rename_axis(None, axis=1)[['book_id','title','bsn','author']])
Выход:
book_id title bsn author
0 1 X,Y 999
1 2 Harry Potter
2 3 Hello World John Doe
Комментарии:
1. Есть идеи, как я могу избавиться от жестко закодированных имен столбцов в
rename_axis
? Толькоbook_id
столбец является статическим, поэтому не изменяется. Все остальные столбцы являются динамическими…2. Список выбора
[['book_id'...]]
послеrename_axis
сортирует столбцы так, как был отсортирован желаемый результат. Без них меняется только порядок столбцов. Вы можете не использовать их, если порядок столбцов не имеет значения.3. Могу ли я использовать
aggfunc
для преобразования его в массив вместо разделенной запятыми строки?['X', 'Y']
вместо'X,Y'
4. ДА. Вы можете использовать
aggfunc=np.array
для преобразования агрегированных данных с несколькими значениями вnp.array
. Илиaggfunc=list
объединить каждое значение в список.