Как преобразовать данные кадра, используя сводную? - PullRequest
1 голос
/ 27 апреля 2020

У меня есть фрейм данных, например:

   ID   id2       Materials
0  12   23       Plastic
1  12   54       Metal
2  12   63       NaN
3  13   75       NaN
4  13   24       Metal

Я хочу, чтобы в каждом идентификаторе была только строка без потери информации об ID2 и материалах. Я думаю, что сводная функция может работать, но, честно говоря, не иметь Идея, как это структурировать. любая идея вывода:

   ID          Plastic   metal  
0  12           23        54
1  13           Nan        24

Ответы [ 3 ]

0 голосов
/ 27 апреля 2020

РЕДАКТИРОВАТЬ: После того как вы отредактировали свой вопрос, вам нужно reshape ваш фрейм данных. За то, что я понимаю, ты хочешь pivot_table. Это означает, что вы измените то, что вы считаете столбцом, значением и индексом. Попробуйте это:

df_pivoted = df.pivot_table(index="ID", columns="Materials", values="id2", \
                            dropna=True, fill_value=-1)

dropNA и fill_value для сохранения int в противном случае он преобразует значения в float

Тогда вы можете reset_index иметь идентификатор в качестве столбцы:

df_pivoted.reset_index()

вывод:

Materials   ID  Glass   Metal   NaN     Plastic
        0   12     -1      54    63          23
        1   13     24      -1    -1          75
0 голосов
/ 27 апреля 2020

Исходя из желаемого результата, вы хотите pivot дейтаграммы со столбцом ID в качестве индекса и формированием нового столбца для каждого из Materials. Также похоже, что вы хотите сначала отбросить наблюдения с отсутствующим значением (NaN) в Materials.

Соединяя эти два шага, можно получить преобразование:

df.dropna(subset=['Materials']) \
  .pivot(index='ID', columns='Materials')

С выводом:

            id2        
Materials Metal Plastic
ID                     
12         54.0    23.0
13         24.0     NaN

Чтобы отформатировать фрейм данных по вашему желанию, вам нужно еще несколько шагов:

df = df.reset_index()
df.columns = ['ID', 'Metal', 'Plastic']

Форматированный формат данных теперь:

   ID  Metal  Plastic
0  12   54.0     23.0
1  13   24.0      NaN
0 голосов
/ 27 апреля 2020

Хочешь этого?

In [310]: df.groupby('ID').agg({'id2': list, 'Materials': list})                                                                                                                                            
Out[310]: 
             id2              Materials
ID                                     
12  [23, 54, 63]  [Plastic, nan, Metal]
13      [75, 24]       [Plastic, Glass]
...