злой стержень панды с многоиндексным, регулярное выражение - PullRequest
0 голосов
/ 28 августа 2018

Я перепробовал каждую комбинацию pandas.melt, .stack и .pivot, но не достиг прогресса.

У меня есть таблица Excel в следующем общем формате:

                1997           1998     1999        2000
Total, N (%)    3350 (34)   3387 (33)   4778 (33)   3588 (33)
Age category N, (%)             
  A             231 (24)    227 (24)    222 (23)    211 (22)
  B             492 (24)    481 (24)    487 (24)    405 (24)
  C             759 (28)    759 (27)    746 (26)    746 (26)
  D            1901 (45)    1873 (44)   1233 (44)   1903 (44)
Sex, N (%)              
  F            1650 (33)    1493 (33)   1673 (33)   1628 (32)
  M            1734 (35)    1794 (34)   1705 (34)   1760 (34)
Diet                
  Vegan        1553 (32)    1442 (31)   1453 (31)   1422 (31)
  Carnivore    1857 (36)    1063 (36)   1225 (35)   1926 (34)
Favorite movie              
  horror       1036 (24)    1033 (24)   1458 (24)   1742 (24)
  romance       732 (41)    743 (40)    735 (40)    799 (38)
  comedy        514 (34)    498 (32)    518 (32)    496 (32)
  silent        1110 (47)   1933 (47)   1967 (46)   1751 (46)
* Percents are in relation to 100% of children who filled out survey                

Я пытаюсь манипулировать этими данными, чтобы я мог создать гистограмму:

  • Ось X для 1997 - 2000
  • ВЛЕВО по оси Y как отсчет N
  • ВПРАВО по оси Y в%

код из листа Excel, который я использую для сборки df:

import pandas as pd

categories = ['Age category N, (%)', 'Sex, N (%)', 'Diet', 'Favorite movie']
subcategories = ['A','B','C','D','F','M',"Vegan","Carnivore",'horror','romance','comedy','silent']


df = pd.DataFrame(
    {'1997':    [33850 (34), NaN ,231 (24),  492 (24), 759 (28), 1901 (45), NaN , 1650 (33),    1734 (35),NaN ,
             1553 (32), 1857 (36),NaN , 1036 (24),  732 (41),   514 (34),   1110 (47)],
    '1998': [33687 (33),NaN ,227 (24),  481 (24),   759 (27),   1873 (44),NaN ,1493 (33),   1794 (34),  NaN ,1442 (31), 1063 (36),NaN , 1033 (24),  743 (40),   498 (32),   1933 (47)],
    '1999': [3778 (33), NaN ,222 (23),  487 (24),   746 (26),   1233 (44),NaN   ,   1673 (33),  1705 (34),NaN , 1453 (31),  1225 (35),NaN   ,   1458 (24),  735 (40),   518 (32),   1967 (46)],
    '2000' : [3588 (33),NaN ,211 (22),  405 (24),   746 (26),   1903 (44),  NaN ,   1628 (32),  1760 (34),NaN , 1422 (31),  1926 (34),NaN , 1742 (24),  799 (38),   496 (32),   1751 (46)]},
        index  = pd.MultiIndex.from_tuples(
            [('Age category N, (%)','A'),('Age category N, (%)','B'),('Age category N, (%)','C'),
            ('Age category N, (%)', 'D'), ('Sex, N (%)', 'F'), ('Sex, N (%)', 'M'),
            ('Diet', 'Vegan'), ('Diet', 'Carnivore'),
            ('Favorite Movie','horror'),('Favorite Movie','romance'),('Favorite Movie','comedy'),('Favorite Movie','silent')],
            names = [categories, subcategories]))

у меня 2 проблемы я ищу сводную таблицу, чтобы строки «возраст», «пол», «диета» и «любимый фильм» были многоиндексными столбцами, с категориями под каждым и с годами в виде строк (наблюдения) итоговый продукт будет выглядеть так:

        'age'       'sex'       'diet'                  'favorite movie'
     A  B   C D     F   M      Vegan  Carnivore     horror  romance comedy  silent 
1997
1998
1999
2000

камнем преткновения является то, что я должен отделить «(%)» от счетчика, сохраняя его «связанным» с его номером (для информирования правой оси y)

Любое руководство действительно ценится!

...