Сводная таблица из списков в значении столбца - PullRequest
1 голос
/ 18 января 2020

У меня есть такой фрейм данных:

    ID       Sim        Items          
    1        0.345      [7,7]            
    2        0.604      [2,7,3,8,5]      
    3        0.082      [9,1,9,1]

Я хочу сформировать pivot_table по:

df.pivot_table(index ="ID" , columns = "Items", values="Sim")

Для этого мне нужно извлечь элементы списка в items в столбец и повторите значения ID, Sim для каждого уникального элемента в row_list. Быть как:

    ID       Sim        Items          
    1        0.345        7  

    2        0.604        2 
    2        0.604        7  
    2        0.604        3  
    2        0.604        8  
    2        0.604        5

    3        0.082        9
    3        0.082        1

Сводная таблица:

         7       2       3       8      5      1      9

    1  0.345     -       -       -      -      -      -
    2  0.604   0.604   0.604   0.604   0.604
    3    -      -        -       -     -     0.082  0.082        

Есть ли подход Pythoni c для этого? Или есть предложения?

1 Ответ

2 голосов
/ 18 января 2020

Используйте Explode ( new в pandas 0.25 + ) перед поворотом;

df.explode('Items').pivot_table(index ="ID" , columns = "Items", values="Sim")

Items      1      2      3      5      7      8      9
ID                                                    
1        NaN    NaN    NaN    NaN  0.345    NaN    NaN
2        NaN  0.604  0.604  0.604  0.604  0.604    NaN
3      0.082    NaN    NaN    NaN    NaN    NaN  0.082

для более низких версий pandas, вы можете попробовать с :

(df.drop('Items',1).join(pd.DataFrame(df['Items'].tolist())
 .stack(dropna=False).droplevel(1).rename('Items'))
  .pivot_table(index ="ID" , columns = "Items", values="Sim"))

Items      1      2      3      5      7      8      9
ID                                                    
1        NaN    NaN    NaN    NaN  0.345    NaN    NaN
2        NaN  0.604  0.604  0.604  0.604  0.604    NaN
3      0.082    NaN    NaN    NaN    NaN    NaN  0.082

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

(df.explode('Items').pivot_table(index ="ID" , columns = "Items", values="Sim")
       .reindex(df.explode('Items')['Items'].unique(),axis=1))

Items      7      2      3      8      5      9      1
ID                                                    
1      0.345    NaN    NaN    NaN    NaN    NaN    NaN
2      0.604  0.604  0.604  0.604  0.604    NaN    NaN
3        NaN    NaN    NaN    NaN    NaN  0.082  0.082
...