Pandas пильные колонны с многоуровневым индексом - PullRequest
0 голосов
/ 27 марта 2020

Initial Data

Вот так выглядят мои данные, когда я читаю их из файла CSV, я читаю, используя многоуровневый индекс (Тип тела и Расходы).

Мне нужен столбец «Год», и все значения в «Расходах» должны отображаться в виде отдельных столбцов. В основном я хочу поменять / транспонировать «Расходы» с «Годами»

Конечные данные должны выглядеть следующим образом

Expectation

Я нашел способ сделать это, но это не кажется эффективным. Мне было интересно, есть ли лучший и более чистый способ сделать это? Я вижу несколько примеров pd.swapaxes (), но не могу заставить его работать.

Вот код, который я использовал:

d = [
    ["Small Narrowbodies", "TotalExpenses", "2326550.00", "2566989.00", "2710156.00"],
    ["Small Narrowbodies", "Pilots (000)", "583404.00", "627762.00", "669258.00"],
    [
        "Small Narrowbodies",
        "Salaries and Wages (000)",
        "432613.00",
        "469059.00",
        "515538.00",
    ],
    ["Small Narrowbodies", "Pilot Training (000)", "28235.00", "22388.00", "23838.00"],
    [
        "Small Narrowbodies",
        "Benefits and Payroll Taxes (000)",
        "77752.00",
        "87128.00",
        "77679.00",
    ],
    [
        "Small Narrowbodies",
        "Per Diem/ Personnel (000)",
        "44804.00",
        "49187.00",
        "52203.00",
    ],
    [
        "Small Narrowbodies",
        "Purchased Goods (000)",
        "627471.00",
        "792582.00",
        "772448.00",
    ],
    ["Small Narrowbodies", "Fuel/Oil (000)", "559698.00", "684007.00", "670673.00"],
    ["Small Narrowbodies", "Insurance (000)", "7483.00", "5449.00", "4200.00"],
    [
        "Small Narrowbodies",
        "Other (inc. Tax) (000)",
        "60290.00",
        "103126.00",
        "97575.00",
    ],
]

df = pd.DataFrame(d, columns=["Body_Type", "Spending", "1995", "1996", "1997"])

df2 = df.set_index(["Body_Type", "Spending"])

df3 = df2.transpose().unstack(level=-1).reset_index()

df3.columns = ["Body_Type", "Spending", "Year", "Amount"]

df4 = df3.pivot_table(
    index["Body_Type", "Year"], columns="Spending", values="Amount", aggfunc=np.sum)

1 Ответ

1 голос
/ 27 марта 2020

Это больше похоже на

df=df.unstack(level=0).stack(level=0)
...