Как поставить уникальные значения 1 серии в виде столбцов и посчитать каждый случай уникальных значений из серии за квартал? - PullRequest
1 голос
/ 13 января 2020

У меня есть df, который выглядит следующим образом:

           date                              col1
0      2020-01-09T19:25                      a
1      2020-01-09T13:27                      a
2      2020-01-04T13:44                      b
3      2019-12-31T15:37                      b
4      2019-12-23T21:47                      c

Я хочу назначить уникальные значения col1 в качестве заголовков столбцов, сгруппировать даты по кварталам и подсчитать уникальные значения col1 по кварталам.

Я могу сгруппировать четверти и посчитать так:

df['date'] = pd.to_datetime(df['date']) 

df = df.groupby(df['date'].dt.to_period('Q'))['col1'].agg(['count'])

Теперь df выглядит так:

               count
dateresponded       
2019Q4            2
2020Q1            3

Я не могу сказать, какое количество уникальных значений сломаны.

Я хочу, чтобы df выглядел так:

                   a                b               c              
dateresponded       
2019Q4                              1               1
2020Q1             2                1

1 Ответ

4 голосов
/ 13 января 2020

IIU C, вы хотите pd.crosstab

new_df = pd.crosstab(df['date'].dt.to_period('Q'),df['col1'],
                     rownames=['dateresponded'],
                     colnames=[None])
print(new_df)

Мы также можем использовать groupby + DataFrame.unstack. Мы можем переименовать ось с использованием DataFrame.rename_axis.

new_df = (df.groupby([df['date'].dt.to_period('Q'),'col1'])
            .size()
            .unstack(fill_value = 0)
            .rename_axis(columns = None,index = 'dateresponded'))
print(new_df)

new_df = (df.groupby(df['date'].dt.to_period('Q'))
            .col1
            .value_counts()
            .unstack(fill_value = 0)
            .rename_axis(columns = None,index = 'dateresponded'))
 print(new_df)

Выход

               a  b  c
dateresponded         
2019Q4         0  1  1
2020Q1         2  1  0
...