Как объединить (разделенные запятыми) значения строк в один столбец в pandas?

#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 объединить каждое значение в список.