Pandas 删除列多索引中的空白行

问题描述 投票:0回答:1

我在 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,这就是您在此处看到的内容。

python pandas dataframe multi-index
1个回答
0
投票

如果您期望这样的输出用于视觉目的,您可以尝试如下所示:

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)
© www.soinside.com 2019 - 2024. All rights reserved.