重新定位数据框

Reorient dataframe

我想在一行中获取 electoresvotes 的数量。

我有这个数据集:

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

预期结果是

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

您尝试做的事情称为旋转。

>>> 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

请注意,在此解决方案中,列有三个级别的索引。这将使从 table 中提取某些切片变得更容易,但如果您确定需要的话,可以将其展平。

使用 pivot 然后将您的多索引转换为单索引:

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()

输出:

>>> 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