首页 > 解决方案 > 根据单元格信息转换 pandas DataFrame

问题描述

我有一个df具有以下格式的 pd DataFrame:

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)

我怎样才能做到这一点?

标签: pythonpandasdataframetuples

解决方案


首先将列拆分为 helper DataFrameSeries.str.split然后使用默认DataFrame.pivot_table的提取积分器,最后创建元组:Series.str.extractmean

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)  

推荐阅读