Para un dataframe como este:

d = {'id': [1,1,1,2,2], 'Month':[1,2,3,1,3],'Value':[12,23,15,45,34], 'Cost':[124,214,1234,1324,234]}
df = pd.DataFrame(d)

     Cost  Month  Value  id  
0    124       1     12   1  
1    214       2     23   1  
2    1234      3     15   1  
3    1324      1     45   2  
4    234       3     34   2  

a la que puedo aplicar pivot_table

df2 =    pd.pivot_table(df, 
                        values=['Value','Cost'],
                        index=['id'],
                        columns=['Month'],
                        aggfunc=np.sum,
                        fill_value=0)

para obtener df2:

       Cost            Value          
Month     1    2     3     1   2   3   
id                                  
1       124  214  1234    12  23  15
2      1324    0   234    45   0  34

hay una manera fácil de formato resultante dataframe nombres de columna como

id     Cost1    Cost2     Cost3 Value1   Value2   Value3   
1       124      214      1234    12        23       15
2      1324       0       234     45         0       34

Si hago:

df2.columns =[s1 + str(s2) for (s1,s2) in df2.columns.tolist()]

Puedo obtener:

    Cost1  Cost2  Cost3  Value1  Value2  Value3
id                                             
1     124    214   1234      12      23      15
2    1324      0    234      45       0      34

Cómo deshacerse del exceso de nivel?

gracias!

OriginalEl autor muon | 2015-10-22

2 Comentarios

  1. 10

    Con pistas de @chrisb de la respuesta, esto me dio exactamente lo que yo buscaba:

    df2.reset_index(inplace=True)

    que da:

    id     Cost1    Cost2     Cost3 Value1   Value2   Value3   
    1       124      214      1234    12        23       15
    2      1324       0       234     45         0       34

    y en el caso de múltiples columnas de índice, este post lo explica bien. sólo para estar completa, aquí es cómo:

    df2.columns = [' '.join(col).strip() for col in df2.columns.values]
    «Aplanar Jerárquica Índice» de la Comunidad del post me ayudó con el mismo problema. df.columnas = [‘a ‘.join(col).strip() de col en el df.columnas.valores]

    OriginalEl autor muon

  2. 9

    'id' es el nombre del índice, en la que puede establecer None a quitar.

    In [35]: df2.index.name = None
    
    In [36]: df2
    Out[36]: 
       Cost1  Cost2  Cost3  Value1  Value2  Value3
    1    124    214   1234      12      23      15
    2   1324      0    234      45       0      34

    OriginalEl autor chrisb

Dejar respuesta

Please enter your comment!
Please enter your name here