基于不同列查找中值的优雅而有效的方法

Elegant and efficient way to find the median value based on different columns

我有一个如下所示的数据框,但我的真实数据框有数百万行

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]
                    })

我想找到每 24 小时进行测试(识别 using test column)的 median 次(使用 0-24hrs24-48hrs48-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()

除了将同一行重复三次之外,还有其他有效且优雅的方法可以找到它吗?因为我的真实数据框有百万行

为什么不试试

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

您也可以通过以下方式进行:-

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()