Pandas вычисляет средние значения столбцов по группам и средним значениям по всему фрейму данных. - PullRequest
0 голосов
/ 18 мая 2018

У меня есть df, df['period'] = (df['date1'] - df['date2']) / np.timedelta64(1, 'D')

code    y_m        date1        date2         period    
1000    201701    2017-12-10   2017-12-09       1
1000    201701    2017-12-14   2017-12-12       2
1000    201702    2017-12-15   2017-12-13       2
1000    201702    2017-12-17   2017-12-15       2
2000    201701    2017-12-19   2017-12-18       1
2000    201701    2017-12-12   2017-12-10       2
2000    201702    2017-12-11   2017-12-10       1
2000    201702    2017-12-13   2017-12-12       1
2000    201702    2017-12-11   2017-12-10       1

, затем groupby code и y_m для вычисления среднего значения date1-date2,

df_avg_period = df.groupby(['code', 'y_m'])['period'].mean().reset_index(name='avg_period')

code        y_m        avg_period
1000        201701     1.5
1000        201702     2
2000        201701     1.5
2000        201702     1

но мне нравится преобразовывать df_avg_period в матрицу, которая транспонирует столбец code в строки и y_m в столбцы, например

      0     1     2             3              
 0   -1     0    201701       201702       
 1   0     1.44  1.44          1.4         
 2   1000  1.75  1.5           2     
 3   2000  1.20  1.5           1

-1 представляет собой фиктивное значение, которое указывает, что любое значение нене существует для конкретной ячейки code / y_m или для поддержания формы матрицы;0 представляет «все» значения, которые усредняют значения code или y_m или code и y_m, например, ячейка (1,1) усредняет значения period для всех строк в df;(1,2) усредняет period для 201701 во всех строках, которые имеют это значение для y_m в df.

, по-видимому, pivot_table не может дать правильные результаты с использованием mean.поэтому мне интересно, как этого добиться правильно?

1 Ответ

0 голосов
/ 18 мая 2018

pivot_table с margins=True

piv = df.pivot_table(
    index='code', columns='y_m', values='period', aggfunc='mean', margins=True
)
# housekeeping
(piv.reset_index()
    .rename_axis(None, 1)
    .rename({'code' : -1, 'All' : 0}, axis=1)
    .sort_index(axis=1)
)

  -1         0        201701   201702
0    1000  1.750000      1.5      2.0
1    2000  1.200000      1.5      1.0
2     All  1.444444      1.5      1.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...