在Python&Pandas子串上融化并合并

2024-06-06 08:59:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据

id      name    model_#   ms   bp1   cd1    sf1    sa1   rq1   bp2   cd2   sf2   sa2   rq2 ... 
1       John    23984     1    23    234    124     25   252   252    62   194    234   234 ... 
2       John    23984     2    234   234    242     62   262   622   262   622    26    262 ... 

对于上百个模型,最大10毫秒,变量数达21。在

我通常用钯熔体在我看bp1:bp21或者其他什么的地方做我的分析。我现在需要创建一个熔体,在那里我查看bp1值和rq1值。在

我希望能有效地创造出这样的东西:

^{pr2}$

现在我所能做的最好的就是:

              id  model_#  ms variable_x  value_x variable_y  value_y
0            113    77515   1        bp1     23        rq1      252
1            113    77515   1        bp1     23        rq2      262
2            113    77515   1        bp1     23        rq3      311
3            113    77515   1        bp1     23        rq4      246

通过:

df = pd.melt(dat, id_vars=['id', 'mod_req', 'ms'], value_vars=bp)
df1 = pd.melt(dat, id_vars=['id', 'mod_req', 'ms'], value_vars=rq)
df2 = pd.merge(df,df1, on=['id', 'mod_req', 'ms'])

有没有一种简单的方法可以在子串上合并,这样bp1就可以连接到rq1等等?这意味着获取一个只查看bp1:bp21和另一个融合的数据帧rq1:rq21并基于子串值进行合并(bp1rq1,而不是bp1rq2)


Tags: 数据idmodmodelvaluevarsjohnreq
1条回答
网友
1楼 · 发布于 2024-06-06 08:59:09

解决方案

设置索引…
使用巧妙的列groupby
另一个聪明的函数apply。。。在

d1 = df.set_index(['id', 'name', 'model_#', 'ms'])

def melt_(df):
    id_vars = df.index.names
    return df.reset_index().melt(id_vars=id_vars).set_index(id_vars)


d2 = d1.groupby(d1.columns.str.extract('(\D+)', expand=False), axis=1).apply(melt_)

d2.columns = d2.columns.swaplevel(0, 1).map('_'.join)
d2.reset_index()

   id  name  model_#  ms variable_bp  value_bp variable_cd  value_cd variable_rq  value_rq variable_sa  value_sa variable_sf  value_sf
0   1  John    23984   1         bp1        23         cd1       234         rq1       252         sa1        25         sf1       124
1   2  John    23984   2         bp1       234         cd1       234         rq1       262         sa1        62         sf1       242
2   1  John    23984   1         bp2       252         cd2        62         rq2       234         sa2       234         sf2       194
3   2  John    23984   2         bp2       622         cd2       262         rq2       262         sa2        26         sf2       622

功能过度

^{pr2}$

旧答案

这可不漂亮,我甚至不确定这是你想要的。在

d1 = df.set_index(['id', 'name', 'model_#', 'ms'])

cidx = pd.MultiIndex.from_tuples(
    d1.columns.to_series().str.extract('(\D+)(\d+)', expand=False).values.tolist(),
    names=[None, 'variable']
)

d1.columns = cidx

d2 = d1.sort_index(axis=1).stack()

variables = pd.DataFrame(
    (d2.columns + d2.index.get_level_values('variable')[:, None]).tolist(),
    d2.index, d2.columns
)

d3 = pd.concat(
    [variables, d2], axis=1, keys=['variable', 'value']
).reset_index('variable', drop=True).sort_index(axis=1, level=1, sort_remaining=False)

d3.columns = d3.columns.map('_'.join)

d3.reset_index()

   id  name  model_#  ms variable_bp  value_bp variable_cd  value_cd variable_rq  value_rq variable_sa  value_sa variable_sf  value_sf
0   1  John    23984   1         bp1        23         cd1       234         rq1       252         sa1        25         sf1       124
1   1  John    23984   1         bp2       252         cd2        62         rq2       234         sa2       234         sf2       194
2   2  John    23984   2         bp1       234         cd1       234         rq1       262         sa1        62         sf1       242
3   2  John    23984   2         bp2       622         cd2       262         rq2       262         sa2        26         sf2       622

相关问题 更多 >