【问题标题】:Transform pandas DataFrame based on cell information根据单元格信息转换 pandas DataFrame
【发布时间】:2021-12-24 20:28:31
【问题描述】:

我有一个 pd DataFrame df,格式如下:

model              auc            p             r
`a-num5-run1`      0.9            0.8           1.0
`a-num5-run2`      0.8            0.7           0.9
`b-num5-run1`      0.7            0.6           0.8
`b-num5-run2`      0.6            0.5           0.7
`a-num10-run1`     0.5            0.4           0.6
`a-num10-run2`     0.4            0.3           0.5
`b-num10-run1`     0.3            0.2           0.4
`b-num10-run2`     0.2            0.1           0.3
.... 
`a-num100-run1`     0.8            0.9           0.7
`a-num100-run2`     0.6            0.7           0.4
`a-num100-run1`     0.4            0.5           0.1
`a-num100-run2`     0.2            0.3           0.8

model 列显示了可以区分每个模型的维度。 现在,我想创建一个 DataFrame,其中每列的值在它们的运行中平均并存储在一个元组中,每个数字是一列,每一行是一个模型(在这种情况下是 a 或 b)。期望的结果将是如下所示的矩阵:

model_name     5                         10                   ...   100
a              (0.85, 0.75, 0.95)        (0.45, 0.35, 0.55)   ...   (0.7, 0.8, 0.55)
b              (0.65, 0.55, 0.75)        (0.25, 0.15, 0.35)   ...   (0.3, 0.4, 0.45)

我该怎么做?

【问题讨论】:

    标签: python pandas dataframe tuples


    【解决方案1】:

    首先通过Series.str.split 将列拆分为帮助器DataFrame,然后使用DataFrame.pivot_tableSeries.str.extract 提取整数,默认为mean,最后创建元组:

    df1 = df['model'].str.split('-', expand=True)
    
    df = (df.pivot_table(index=df1[0], 
                        columns=df1[1].str.extract('(\d+)', expand=False).astype(int), 
                        values=['auc','p','r'], fill_value=0)
           .round(2)
           .T
           .groupby(level=1)
           .agg(tuple)
           .T)
    print (df)
    1                 5                   10               100
    0                                                         
    a  (0.85, 0.75, 0.95)  (0.45, 0.35, 0.55)  (0.5, 0.6, 0.5)
    b  (0.65, 0.55, 0.75)  (0.25, 0.15, 0.35)  (0.0, 0.0, 0.0)
    

    如果列的顺序未排序,请使用:

    df = df.join(df[['auc','p','r']].add_suffix('_std'))
    # print (df)
    
    #not sorted ordering of columns
    cols = ['p', 'p_std','auc', 'auc_std', 'r','r_std']
    
    df1 = df['model'].str.split('-', expand=True)
    
    df = (df.pivot_table(index=df1[0], 
                        columns=df1[1].str.extract('(\d+)', expand=False).astype(int), 
                        values=cols, fill_value=0)
           .round(2)
           .reindex(cols, axis=1, level=0)
           .T
           .groupby(level=1)
           .agg(tuple)
           .T)
    print (df)
    1                                   5                                     10   \
    0                                                                               
    a  (0.75, 0.75, 0.85, 0.85, 0.95, 0.95)  (0.35, 0.35, 0.45, 0.45, 0.55, 0.55)   
    b  (0.55, 0.55, 0.65, 0.65, 0.75, 0.75)  (0.15, 0.15, 0.25, 0.25, 0.35, 0.35)   
    
    1                             100  
    0                                  
    a  (0.6, 0.6, 0.5, 0.5, 0.5, 0.5)  
    b  (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)  
    

    【讨论】:

    • 当我尝试使用更多值运行它时,元组中变量的顺序会发生变化。在上面的列之上,我还有与每个变量相关的标准偏差。所以我的变量是:aucauc_stdpp_stdrr_std。但是,当我在您的代码中使用 values = ['auc', 'auc_std', 'p', 'p_std','r','r_std'] 时,元组中变量的顺序是不同的。你知道我怎样才能保持相同的顺序吗?
    • @Emil - 你觉得像values=['p', 'p_std','auc', 'auc_std', 'r','r_std'] 吗?所以如果排序顺序不同?为此编辑了答案
    猜你喜欢
    • 2021-11-08
    • 2017-11-20
    • 2013-01-19
    • 2022-01-13
    • 2021-12-03
    • 2019-09-03
    • 2020-12-22
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多