重新定位数据框
Reorient dataframe
我想在一行中获取 electores
和 votes
的数量。
我有这个数据集:
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
我想在一行中获取 electores
和 votes
的数量。
我有这个数据集:
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