我在 pandas 中有多索引数据框。我似乎无法在维护多索引的同时删除列标题下的空白行。
这是我所拥有的:
3 个月总计 | 3 个月总计 | 3 个月总计 | 八月 | 八月 | 八月 | 七月 | 七月 | 七月 | 六月 | 六月 | 六月 | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
变量 | 销售 | 成本 | 全科医生 | 销售 | 成本 | 全科医生 | 销售 | 成本 | 全科医生 | 销售 | 成本 | 全科医生 | |||
部门 | 地区 | 商店 | 员工 | ||||||||||||
商业 | 德克萨斯州 | 0001 | 鲍勃 | 1000 | 600 | 400 | 450 | 200 | 250 | 150 | 100 | 50 | 400 | 300 | 100 |
零售 | 西 | 0406 | 莎莉 | 2400 | 1700 | 700 | 1100 | 800 | 300 | 750 | 500 | 250 | 550 | 400 | 150 |
这就是我想要的。
3 个月总计 | 3 个月总计 | 3 个月总计 | 八月 | 八月 | 八月 | 七月 | 七月 | 七月 | 六月 | 六月 | 六月 | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
部门 | 地区 | 商店 | 员工 | 销售 | 成本 | 全科医生 | 销售 | 成本 | 全科医生 | 销售 | 成本 | 全科医生 | 销售 | 成本 | 全科医生 |
商业 | 德克萨斯州 | 0001 | 鲍勃 | 1000 | 600 | 400 | 450 | 200 | 250 | 150 | 100 | 50 | 400 | 300 | 100 |
零售 | 西 | 0406 | 莎莉 | 2400 | 1700 | 700 | 1100 | 800 | 300 | 750 | 500 | 250 | 550 | 400 | 150 |
有人可以指出我正确的方向吗?
我发现了这个,但随着列标题的变化,硬编码值对我不起作用。
编辑:这里是要求的 df.head().to_dict('tight') 。
{'index': [('Commerical',
'Service',
426,
'Los Angeles, CA',
2767,
78910,
'Steve'),
('Retail', 'Service', 1, 'Houston, TX', 2706, 123456, 'Bob')],
'columns': [('3 Months Combined', 'Adjusted Hrs'),
('3 Months Combined', 'Clocked Hrs'),
('3 Months Combined', 'GP'),
('3 Months Combined', 'GP-Supp'),
('3 Months Combined', 'Mobile'),
('3 Months Combined', 'Prd Hrs'),
('3 Months Combined', 'Sum of Days Worked'),
('3 Months Combined', 'Supp $'),
('3 Months Combined', 'Total Billed Hrs'),
('3 Months Combined', 'Total Billed Revenue'),
('3 Months Combined', 'Total Clocked Hrs'),
('3 Months Combined', 'Total External Cost'),
('3 Months Combined', 'Total Non Billed Hrs'),
('3 Months Combined', 'Rev/Day'),
('3 Months Combined', 'Hrs Billed/Day'),
('3 Months Combined', 'Prof%'),
('3 Months Combined', 'GP/Day'),
('3 Months Combined', 'GP-Supp/Day'),
('3 Months Combined', 'Avg Supp/Day'),
('3 Months Combined', 'Eff Rate'),
('3 Months Combined', 'Prod%'),
('3 Months Combined', 'Eff%'),
('August', 'Title'),
('August', 'Level'),
('August', '40-30-20-10'),
('August', 'Rev/Day'),
('August', 'Hrs Billed/Day'),
('August', 'Prof%'),
('August', 'GP/Day'),
('August', 'GP-Supp/Day'),
('August', 'GP%'),
('August', 'Total Supp $/Day'),
('August', 'Eff Rate'),
('August', 'Prod%'),
('August', 'Eff%'),
('August', 'Labor Rate'),
('August', 'Tech Count'),
('July', 'Title'),
('July', 'Level'),
('July', '40-30-20-10'),
('July', 'Rev/Day'),
('July', 'Hrs Billed/Day'),
('July', 'Prof%'),
('July', 'GP/Day'),
('July', 'GP-Supp/Day'),
('July', 'GP%'),
('July', 'Total Supp $/Day'),
('July', 'Eff Rate'),
('July', 'Prod%'),
('July', 'Eff%'),
('July', 'Labor Rate'),
('July', 'Tech Count'),
('June', 'Title'),
('June', 'Level'),
('June', '40-30-20-10'),
('June', 'Rev/Day'),
('June', 'Hrs Billed/Day'),
('June', 'Prof%'),
('June', 'GP/Day'),
('June', 'GP-Supp/Day'),
('June', 'GP%'),
('June', 'Total Supp $/Day'),
('June', 'Eff Rate'),
('June', 'Prod%'),
('June', 'Eff%'),
('June', 'Labor Rate'),
('June', 'Tech Count')],
'data': [[-81.30000000000001,
501.06,
32378.5,
31716.28,
0,
473.83,
60,
662.22,
497.8,
48308.100000000006,
579.3,
15929.6,
2.5,
805.1350000000001,
8.296666666666667,
0.8556204881402545,
539.6416666666667,
528.6046666666666,
11.037,
97.0431900361591,
0.9409603622209866,
0.8284194753392566,
'VEH MOD TECH 4',
4,
0.863313125913714,
422.890476190476,
5.03809523809524,
1.01584253480557,
261.671428571429,
261.671428571429,
0.618768790748477,
0.0,
83.9385633270321,
0.954909470752089,
1.02035855363112,
32,
1,
'VEH MOD TECH 4',
4,
1.9189405558250532,
1547.32470588235,
15.2764705882353,
0.829235583370586,
1058.47764705882,
1019.52352941176,
0.684069505925217,
38.9541176470588,
101.288101655757,
0.976361031518625,
0.625972120322817,
32,
1,
'VEH MOD TECH',
4,
0.9339213695893974,
596.494545454546,
6.01363636363636,
0.804402018605217,
404.058181818182,
404.058181818182,
0.677387890463069,
0.0,
99.1903250188964,
0.902629931120852,
0.805353220025436,
32,
1],
[18.8,
462.45,
27412.2,
27214.64,
'XXX',
462.45,
32,
197.56,
476.01,
45859.7,
470.95,
18447.5,
1.0,
1433.115625,
14.8753125,
1.0086026062082847,
856.63125,
850.4575,
6.17375,
96.3418835738745,
0.9978422699320315,
1.040653043572278,
'MBL SVC TECH 5',
5,
1.0367635962028665,
758.888888888889,
9.61111111111111,
1.02366863905325,
278.333333333333,
256.382222222222,
0.366764275256223,
21.9511111111111,
78.9595375722543,
0.992994746059545,
1.0,
50,
1,
'MBL SVC TECH 5',
5,
1.5748790164805966,
1449.45,
16.0227272727273,
1.0,
1149.45,
1149.45,
0.79302494049467,
0.0,
90.4621276595745,
1.0,
1.0,
50,
1,
'MBL SVC TECH 5',
5,
1.8559248654501908,
1923.8125,
17.7716666666667,
1.00975378787879,
1021.9375,
1021.9375,
0.531204314349761,
0.0,
108.251664634718,
1.0,
1.1544782251438,
50,
1]],
'index_names': ['Division',
'Department',
'Profit Center',
'Branch',
'Tech ID',
'Employee No',
'Tech Name'],
'column_names': [None, 'variable']}
编辑2:我正在将几个数据文件读入数据框中,合并它们,然后进行熔化,这样我就可以进行一些计算并按月分组。然后,我将数据框放入数据透视表中,以便所有内容都按月分组。这个新的数据透视表是 df1。我根据原始数据框制作了另一个数据透视表,其中包含 3 个月的合并总计,称为 df2。然后,我合并这两个数据透视表以创建一个新的数据透视表 df3,这就是您在此处看到的内容。
如果您期望这样的输出用于视觉目的,您可以尝试如下所示:
def shift_header(df, cols):
return df.T.reset_index().T.reset_index(drop=True).set_axis(cols, axis=1)
l0, l1 = zip(*df.columns)
left = df.index.to_frame(index=False).pipe(shift_header, cols=[""]*len(set(l0)))
right = (
pd.DataFrame(df.reset_index(drop=True).to_numpy(), columns=l1)
.pipe(shift_header, cols=l0)
)
out = pd.concat([left, right], axis=1)
输出:
3 个月总计 | 3 个月总计 | 3 个月总计 | 八月 | 八月 | 八月 | 七月 | 七月 | 七月 | 六月 | 六月 | 六月 | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 部门 | 地区 | 商店 | 员工 | 销售 | 成本 | 全科医生 | 销售 | 成本 | 全科医生 | 销售 | 成本 | 全科医生 | 销售 | 成本 | 全科医生 |
1 | 商业 | 德克萨斯州 | 1 | 鲍勃 | 1000 | 600 | 400 | 450 | 200 | 250 | 150 | 100 | 50 | 400 | 300 | 100 |
2 | 零售 | 西 | 406 | 莎莉 | 2400 | 1700 | 700 | 1100 | 800 | 300 | 750 | 500 | 250 | 550 | 400 | 150 |
使用的输入:
df = pd.read_clipboard(header=[0, 1]).rename_axis([None, "variable"], axis=1)