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.