Home > Enterprise >  Reorient dataframe
Reorient dataframe

Time:11-21

I want to get the quantity of electores and votes in a single row.

I have this data set:

electores = pd.DataFrame([['fdt','concejal','Escuela 1','X1001','350','positivo','4'],
                            ['jxc','concejal','Escuela 1','X1001','350','positivo','5'],
                            ['fdt','diputado','Escuela 1','X1001','350','positivo','4'],
                            ['jxc','diputado','Escuela 1','X1001','350','positivo','2'],
                            ['fdt','concejal','Escuela 1','X1002','350','positivo','4'],
                            ['jxc','concejal','Escuela 1','X1002','350','positivo','5'],
                            ['fdt','diputado','Escuela 1','X1002','350','positivo','3'],
                            ['jxc','diputado','Escuela 1','X1002','350','positivo','2'],
                            ['','concejal','Escuela 1','X1001','350','negativo','2'],
                            ['','concejal','Escuela 1','X1002','350','negarivo','2'],
                            ['','diputado','Escuela 1','X1001','350','negativo','4'],
                            ['','diputado','Escuela 1','X1002','350','negartivo','0']],
columns = ['agrup','cargo','estable','mesa','electores','tipo_de_voto','cantidad'])
agrup cargo estable mesa electores tipo_de_voto cantidad
fdt concejal Escuela 1 X1001 35 positivo 4
jxc concejal Escuela 1 X1001 35 positivo 5
fdt diputado Escuela 1 X1001 35 positivo 4
jxc diputado Escuela 1 X1001 35 positivo 2
fdt concejal Escuela 1 X1002 35 positivo 4
jxc concejal Escuela 1 X1002 35 positivo 5
fdt diputado Escuela 1 X1002 35 positivo 3
jxc diputado Escuela 1 X1002 35 positivo 2
concejal Escuela 1 X1001 35 negativo 2
concejal Escuela 1 X1002 35 negativo 2
diputado Escuela 1 X1001 35 negativo 4
diputado Escuela 1 X1002 35 negativo 0

The expect result would be

estable mesa electores concejales_positivo_fdt diputados_positivo_fdt concejales_positivo_jxc diputados_positivo_jxc concejal_negativo diputado_negarivo
Escuela 1 X1001 35 4 4 5 2 2 4
Escuela 1 X1002 35 4 3 5 2 2 0

CodePudding user response:

Use pivot then convert your multiindex to single index:

out = electores.pivot(index=['estable', 'mesa', 'electores'],
                      columns=['cargo', 'tipo_de_voto', 'agrup'],
                      values=['cantidad']).fillna(0)

out.columns = out.columns.droplevel(0).to_flat_index().str.join('_')
out = out.reset_index()

Output:

>>> out
     estable   mesa electores positivo_fdt positivo_jxc positivo_fdt positivo_jxc negativo_ negarivo_ negativo_ negartivo_
0  Escuela 1  X1001       350            4            5            4            2         2         0         4          0
1  Escuela 1  X1002       350            4            5            3            2         0         2         0          0

CodePudding user response:

What you are trying to do is called pivoting.

>>> electores
   agrup     cargo    estable   mesa electores tipo_de_voto cantidad
0    fdt  concejal  Escuela 1  X1001       350     positivo        4
1    jxc  concejal  Escuela 1  X1001       350     positivo        5
2    fdt  diputado  Escuela 1  X1001       350     positivo        4
3    jxc  diputado  Escuela 1  X1001       350     positivo        2
4    fdt  concejal  Escuela 1  X1002       350     positivo        4
5    jxc  concejal  Escuela 1  X1002       350     positivo        5
6    fdt  diputado  Escuela 1  X1002       350     positivo        3
7    jxc  diputado  Escuela 1  X1002       350     positivo        2
8         concejal  Escuela 1  X1001       350     negativo        2
9         concejal  Escuela 1  X1002       350     negarivo        2
10        diputado  Escuela 1  X1001       350     negativo        4
11        diputado  Escuela 1  X1002       350    negartivo        0

>>> electores.pivot(values='cantidad', columns=['agrup', 'tipo_de_voto', 'cargo'], index=['estable', 'mesa', 'electores'])

agrup                          fdt      jxc      fdt      jxc
tipo_de_voto              positivo positivo positivo positivo negativo negarivo negativo negartivo
cargo                     concejal concejal diputado diputado concejal concejal diputado  diputado
estable   mesa  electores
Escuela 1 X1001 350              4        5        4        2        2      NaN        4       NaN
          X1002 350              4        5        3        2      NaN        2      NaN         0

Note that in this solution, there are three levels of indexing for the columns. This will make it easier to get certain slices out of the table, though it can be flattened if you're sure that you want that.

  • Related