python - 根据单元格信息转换 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)
我怎样才能做到这一点?
解决方案
首先将列拆分为 helper DataFrame
,Series.str.split
然后使用默认DataFrame.pivot_table
的提取积分器,最后创建元组:Series.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)
推荐阅读
- linux - 为特定模式的所有索引重新索引弹性数据
- ruby-on-rails - 在 Rails 5 中更新模型的特定属性
- javascript - 如何设置 vue 配置以使构建正常工作?
- r - 在闪亮的应用程序中使用 dt 的列宽
- python-2.7 - 使用 Python 从 PDF 中读取特殊字符和字体
- java - java中对线程的引用何时超出范围?
- regex - 如何在某个位置删除带有ES字符的行notepad ++
- javascript - select2 选择器不起作用
- java - 无法使用 Selenium 在谷歌新闻页面中获取新闻文章链接
- php - PHP - 如果 IPv4 IP 在 IP 范围内,如何匹配?