Как установить значения столбца в виде столбцов в кадре данных? - PullRequest
1 голос
/ 10 июля 2019

Я ищу лучший код для преобразования моего DataFrame. Мой DataFrame выглядит так:

    Period  LASTDATE    PRICE   VAT SUM CLIENT
0   2018Q1  31/3/2018   1       2   3   NAME
1   2018Q2  30/6/2018   2       2   4   NAME
2   2018Q3  30/9/2018   3       3   6   NAME
3   2018Q4  31/12/2018  4       4   8   NAME

Я хочу добиться этого:

    2018Q1  2018Q2  2018Q3  2018Q4  LASTDATE    SUM
NAME    3     4       6        8    31/12/2018  21

Пока что я отделил столбец Period от DataFrame и сделал его заголовком. Я считаю, что есть лучший способ закодировать это. Я искал документацию панд и считаю, что set_index() может мне помочь. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

Создать Series на DataFrame.set_index для индекса на Period, преобразовать в один столбец DataFrame на Series.to_frame, транспонировать на DataFrame.T и последнее добавление новых столбцов: DataFrame.assign:

df1 = (df.set_index('Period')['SUM']
         .to_frame()
         .T
         .rename_axis(None, axis=1)
         .assign(LASTDATE = df['LASTDATE'].iat[-1], SUM = df['SUM'].sum()))
print (df1)
     2018Q1  2018Q2  2018Q3  2018Q4    LASTDATE  SUM
SUM       3       4       6       8  31/12/2018   21
2 голосов
/ 10 июля 2019

К сожалению, ответ jezrael не сработает, если у вас более 1 клиента, и он не даст вам имя клиента в качестве индекса (как в выходных данных вашего примера).
Попробуйте следующее:

df1 = df.pivot(index='CLIENT', columns='Period', values='SUM')
df_agg = df.groupby('CLIENT').agg({'LASTDATE': 'last', 'SUM': 'sum'})
df_fin = pd.concat([df1, df_agg], axis=1)

В первой строке вы изменяете фрейм данных, но теряете значение LASTDATE, которое вы возвращаете во второй строке (вместе с общей суммой для каждого клиента), а затем объединяете фреймы данных в последней строке.
Для расширенного воображаемого фрейма данных:

   Period    LASTDATE  PRICE  VAT  SUM CLIENT
0  2018Q1   31/3/2018      1    2    3  NAME1
1  2018Q2   30/6/2018      2    2    4  NAME1
2  2018Q3   30/9/2018      3    3    6  NAME1
3  2018Q4  31/12/2018      4    4    8  NAME1
4  2018Q1   31/3/2018      2    2    1  NAME2
5  2018Q2   30/6/2018      4    2    2  NAME2
6  2018Q3   30/9/2018      6    3    3  NAME2
7  2018Q4  31/12/2018      8    4    4  NAME2

вы должны получить следующее:

        2018Q1  2018Q2  2018Q3  2018Q4    LASTDATE  SUM
CLIENT                                                 
NAME1        3       4       6       8  31/12/2018   21
NAME2        1       2       3       4  31/12/2018   10

Проверено на пандах 0.24.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...