首页 > 解决方案 > Python Pandas 中的数据框转换,其中每个单元格由竖线分隔

问题描述

我有一个熊猫数据框,输入看起来像这样(只是复制第一行)

ID    Intervention Arm 1    Outcome Arm 1    Intervention Arm 2    Outcome Arm 2
340   AB | XY | PQ          LS | TU          LT                    CG | DQ

我希望我的最终输出看起来像

ID      Arm    Intervention        Description    Outcome
340     1      Multi Component     AB | XY | PQ   LS
340     1      Multi Component     AB | XY | PQ   TU
340     2      LT                                 CG
340     2      LT                                 DQ

输出中发生的情况是,它是数据从宽到长的半转换,对于每一行,我们采用Outcome Arm分隔符并将其拆分|,使其成为两个单独的行。另一个条件是,如果 中有多个值Intervention Arm,那么在输出中应该有一个名为的列,如果有else 它应该列出Intervention这个词,它应该简单地列出干预(就像我在干预臂 2 中向你展示的那样例子)。Multiple Component|

这就是我所做的

df2 = pd.melt(df, id_vars = ['Record ID'], var_name = 'metrics', value_name = 'values')

在进行了一些转换和数据清理之后,我能够获得输出的第一部分,但我无法获得输出的最后一列。我该怎么做才能以我想要的形式获得输出?

apply我还尝试使用函数和使用拆分值的方法提取各个列split,但它同时拆分了干预和结果列,但我只需要拆分结果而不是干预,干预将根据我上面列出的条件具有值。

我不是 Pandas 的高级用户。请帮助我。

编辑1: 如果这样做更简单,我们会得到这样的输出,然后使用 if 条件创建一个新列以获得我想要的输出

ID    Arm    Intervention    Outcome
340   1      AB | XY | PQ    LS
340   1      AB | XY | PQ    TU
340   2      LT              CG
340   2      LT              DQ

标签: pythonpython-3.xpandasdataframedata-cleaning

解决方案


尝试:

df.columns=df.columns.str.replace(" Arm",'')
out=pd.wide_to_long(df,['Intervention','Outcome'],'ID','Arm',sep=' ')
out=(out.assign(Outcome=out.pop('Outcome').astype(str).str.split('|'))
        .explode('Outcome').reset_index())
out['Description']=out['Intervention'].mask(out['Intervention'].eq("LT"),'')
out['Intervention']=out['Intervention'].where(out['Intervention'].eq("LT"),'Multi Component')

输出out

    ID      Arm     Intervention    Outcome     Description
0   340     1       Multi Component     LS  AB | XY | PQ
1   340     1       Multi Component     TU  AB | XY | PQ
2   340     2       LT                  CG  
3   340     2       LT                  DQ  

推荐阅读