【问题标题】:Generate descriptive statistics for each row value and transpose dynamically为每行值生成描述性统计数据并动态转置
【发布时间】:2019-10-15 08:23:13
【问题描述】:

我有一个如下所示的数据框

df = pd.DataFrame({
'subject_id':[1,1,1,1,2,2,2,2,3,3,4,4,4,4,4],
'readings' : ['READ_1','READ_2','READ_1','READ_3','READ_1','READ_5','READ_6','READ_8','READ_10','READ_12','READ_11','READ_14','READ_09','READ_08','READ_07'],
'val' :[5,6,7,11,5,7,16,12,13,56,32,13,45,43,46],
})

我想做的是获取现有列的描述性统计/汇总形式,而不是拥有原始列。我希望看到 (min,max,25%,75%,std,var) 作为每个主题的新列

我尝试了以下,但输出不准确

df.groupby(['subject_id','readings']).describe().reset_index()   #this gives some output but it isn't exact
df.groupby(['subject_id','readings']).pivot_table(values='val', index='subject_id', columns='readings').describe()  # this throws error

我希望我的输出如下所示。基本上它将是一个宽而稀疏的矩阵。由于屏幕截图很宽,我无法进一步放大。如果你点击图片,你会更好的显示预期的输出

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    describe 之后使用Series.unstack 进行整形,然后使用DataFrame.swaplevel 并按原始添加DataFrame.reindex 进行排序:

    df = (df.groupby(['subject_id','readings'])['val']
            .describe()
            .unstack()
            .swaplevel(0,1,axis=1)
            .reindex(df['readings'].unique(), axis=1, level=0))
    df.columns = df.columns.map('_'.join)
    df = df.reset_index()
    print (df)
    
       subject_id  READ_1_count  READ_1_mean  READ_1_std  READ_1_min  READ_1_25%  \
    0           1           2.0          6.0    1.414214         5.0         5.5   
    1           2           1.0          5.0         NaN         5.0         5.0   
    2           3           NaN          NaN         NaN         NaN         NaN   
    3           4           NaN          NaN         NaN         NaN         NaN   
    
       READ_1_50%  READ_1_75%  READ_1_max  READ_2_count  ...  READ_08_75%  \
    0         6.0         6.5         7.0           1.0  ...          NaN   
    1         5.0         5.0         5.0           NaN  ...          NaN   
    2         NaN         NaN         NaN           NaN  ...          NaN   
    3         NaN         NaN         NaN           NaN  ...         43.0   
    
       READ_08_max  READ_07_count  READ_07_mean  READ_07_std  READ_07_min  \
    0          NaN            NaN           NaN          NaN          NaN   
    1          NaN            NaN           NaN          NaN          NaN   
    2          NaN            NaN           NaN          NaN          NaN   
    3         43.0            1.0          46.0          NaN         46.0   
    
       READ_07_25%  READ_07_50%  READ_07_75%  READ_07_max  
    0          NaN          NaN          NaN          NaN  
    1          NaN          NaN          NaN          NaN  
    2          NaN          NaN          NaN          NaN  
    3         46.0         46.0         46.0         46.0  
    
    [4 rows x 105 columns]
    

    【讨论】:

    • 谢谢你会试试的。你让它看起来很容易。太棒了。赞成
    • @SSMK - 解决方案已更改,请测试最新版本。
    • 目前正在将其应用于大小为 4779657 (rows) and 26(columns) 的数据集。它运行了半个多小时。有没有其他方法可以加快速度?
    • @SSMK - 我检查了两个问题,unstack 不适用于 dask 实施。原因是它有点像旋转通常非常复杂的操作并且不容易并行化。
    • 有什么方法可以将其固定在这样的庞大数据集上吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2021-09-08
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    相关资源
    最近更新 更多