Переопределить / переместить значения из нижних строк в верхние строки в указанных столбцах c (pandas) - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть датафрейм, как показано ниже, и я хотел бы переместить значения из 'phone', 'spotify' и 'rent' из нижней половины и переопределить верхнюю половину (по сути, разделив фрейм данных на два и поместив значения «расхода» на половину «дохода».

В настоящее время январь и декабрь дважды. Я хочу, чтобы это было просто 12 строк со значениями в каждой ячейке (ie нет ячейки со значением 0.0 в качестве значения ).

                    loan      csn  salary  phone  spotify    rent
january   income   1200.0  13000.0  2000.0    0.0      0.0     0.0
february  income   1200.0  13000.0  2000.0    0.0      0.0     0.0
march     income   1200.0  13000.0  2000.0    0.0      0.0     0.0
april     income   1200.0  13000.0  2000.0    0.0      0.0     0.0
may       income   1200.0  13000.0  2000.0    0.0      0.0     0.0
june      income   1200.0  13000.0  2000.0    0.0      0.0     0.0
july      income   1200.0  13000.0  2000.0    0.0      0.0     0.0
august    income   1200.0  13000.0  2000.0    0.0      0.0     0.0
september income   1200.0  13000.0  2000.0    0.0      0.0     0.0
october   income   1200.0  13000.0  2000.0    0.0      0.0     0.0
november  income   1200.0  13000.0  2000.0    0.0      0.0     0.0
december  income   1200.0  13000.0  2000.0    0.0      0.0     0.0
january   expense     0.0      0.0     0.0  300.0     49.0  3500.0
february  expense     0.0      0.0     0.0  300.0    149.0  3500.0
march     expense     0.0      0.0     0.0  300.0     49.0  3500.0
april     expense     0.0      0.0     0.0  300.0     49.0  3500.0
may       expense     0.0      0.0     0.0  300.0     49.0  3500.0
june      expense     0.0      0.0     0.0  300.0     49.0  3500.0
july      expense     0.0      0.0     0.0  300.0     49.0  3500.0
august    expense     0.0      0.0     0.0  300.0     49.0  3500.0
september expense     0.0      0.0     0.0  300.0     49.0  3500.0
october   expense     0.0      0.0     0.0  300.0     49.0  3500.0
november  expense     0.0      0.0     0.0  300.0     49.0  3500.0
december  expense     0.0      0.0     0.0  300.0     49.0  3500.0

Получение данных от. JSON:

        df_all = pd.DataFrame.from_dict({(i,j): data[i][j] 
                           for i in data.keys() 
                           for j in data[i].keys()},
                       orient='index')

. JSON структура файла:

{
    "january": {
        "income": {
            "loan": 1200,
            "csn": 13000,
            "salary": 2000
        },
        "expense": {
            "phone": 300,
            "spotify": 49,
            "rent": 3500
        }
        ...

Желаемый выход:

                    loan      csn  salary  phone  spotify    rent
january   income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
february  income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
march     income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
april     income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
may       income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
june      income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
july      income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
august    income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
september income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
october   income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
november  income   1200.0  13000.0  2000.0  300.0     49.0  3500.0
december  income   1200.0  13000.0  2000.0  300.0     49.0  3500.0

1 Ответ

1 голос
/ 08 февраля 2020

Вот один из способов:

df = df.rename(index={'expense':'income'}, level=1).fillna(0).groupby(level=[0,1]).sum()
df

Вывод:

            loan    csn  Salary  phone  spotify  rent
Apr income  1200  13000  2000.0    300       49  3500
Aug income  1200  13000  2000.0    300       49  3500
Dec income  1200  13000  2000.0    300       49  3500
Feb income  1200  13000  2000.0    300       49  3500
Jan income  1200  13000  2000.0    300       49  3500
Jul income  1200  13000  2000.0    300       49  3500
Jun income  1200  13000  2000.0    300       49  3500
Mar income  1200  13000  2000.0    300       49  3500
May income  1200  13000  2000.0    300       49  3500
Nov income  1200  13000  2000.0    300       49  3500
Oct income  1200  13000  2000.0    300       49  3500
Sep income  1200  13000  2000.0    300       49  3500

Подробности:

Переименовать индекс уровень 1 такой, что «расход» становится «доходом», затем используйте groupby оба уровня индекса. Мы могли бы использовать first, но я не думаю, что будущее и безопасное, поэтому я выбираю fillna с нулем и sum.

...