python - 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
解决方案
尝试:
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
推荐阅读
- ios - 如何修复错误“预期表达式”
- c - 如何创建两个具有相同md5的二进制文件
- r - 在 R markdown 中截断的 iGraph 数字
- javascript - 前端框架
- c# - 带有“take”的 Azure Tables 异步查询筛选器未提供前 #n 个实体
- python - 立即获得 Python HttpServer 响应
- javascript - 运行应用程序时遇到问题,apk 文件未安装在我的手机中
- git - Git撤消同时处理的分支合并
- jsonschema - 基本 URL 如何使用 JSON Schema 更改纯名称片段解析?
- docker - 当有自定义操作时,如何使用 docker image tensorflow/serving 为 tensorflow 模型提供服务?