Элегантный и эффективный способ найти среднее значение на основе разных столбцов

#python #pandas #dataframe #pandas-groupby #series

Вопрос:

У меня есть фрейм данных, как показано ниже, но мой реальный фрейм данных содержит миллионы строк

 te_df = pd.DataFrame({'subject_id':[1,1,1,2,2,2,3,3],
                      'test':['test1','test2','test3','test1','test2','test3','test1','test4'],
              '0-24hrs':[1,1,1,2,1,1,np.nan,np.nan],
              '24-48hrs':[np.nan,np.nan,np.nan,1,1,1,2,1],
              '48-72hrs':[2,3,1,3,3,np.nan,np.nan,np.nan]
                    })
 

Я хотел бы узнать median , сколько раз проводится тест (идентификация using test column ) каждые 24 часа (с использованием 0-24hrs , 24-48hrs , 48-72hrs )

Я попробовал следующее

 df_out = pd.DataFrame()
df_out['1st_24'] = te_df.groupby('test')['0-24hrs'].median()
df_out['2nd_24'] = te_df.groupby('test')['24-48hrs'].median()
df_out['3rd_24'] = te_df.groupby('test')['48-72hrs'].median()
 

Вместо того, чтобы повторять одну и ту же строку трижды, есть ли какой-либо другой эффективный и элегантный способ найти это? Потому что в моем реальном фрейме данных миллион строк

Комментарии:

1. В чем дело te_df.groupby('test').median() ?

Ответ №1:

Почему бы не попробовать

 out = df.groupby('test')[['0-24hrs', '24-48hrs', '48-72hrs']].median()
       0-24hrs  24-48hrs  48-72hrs
test                              
test1      1.5       1.5       2.5
test2      1.0       1.0       3.0
test3      1.0       1.0       1.0
test4      NaN       1.0       NaN
 

Комментарии:

1. FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead. 🙂

2. @QuangHoang ах, ты попался ~

Ответ №2:

Вы также можете сделать это с помощью:-

 df_out=te_df.groupby('test').median().drop(columns=['subject_id'])

#output

       0-24hrs  24-48hrs    48-72hrs
test            
test1   1.5     1.5         2.5
test2   1.0     1.0         3.0
test3   1.0     1.0         1.0
test4   NaN     1.0         NaN
 

Примечание: В методе @BENY для доступа к значениям столбцов путем передачи списка вы не получите предупреждение:

 out = df.groupby('test')[['0-24hrs', '24-48hrs', '48-72hrs']].median()