如何将含不同值的重复Well行转换为多列浓度宽表?
解决长表转宽表并填充缺失值的问题
核心思路
利用pandas的透视表功能直接将长格式数据转换为宽格式,同时自动填充缺失的药物浓度为0,无需手动创建初始全0的DataFrame。
具体实现步骤
- 导入pandas库
import pandas as pd
- 构造/读取原始数据
如果是从CSV文件读取数据:
df = pd.read_csv("your_data.csv")
如果用示例数据测试:
data = [ ["A1", "D1", 0.5], ["A1", "D2", 0.25], ["A1", "D3", 0.1], ["B1", "D1", 0.5], ["B1", "D2", 0.25] ] df = pd.DataFrame(data, columns=["Well", "Drug", "Drug_Conc"])
- 转换为宽表并填充缺失值
使用pivot_table一步完成转换和填充:
wide_df = df.pivot_table( index="Well", # 指定作为行标识的列 columns="Drug", # 指定拆分列为多列的字段 values="Drug_Conc", # 填充到单元格的数值 fill_value=0 # 缺失值自动填充为0 ).reset_index() # 将Well从索引转为普通列
- 调整列名匹配需求
# 将D1/D2/D3重命名为目标格式的列名 wide_df.columns = ["Well", "Drug1_conc", "Drug2_conc", "Drug3_conc"]
最终结果
运行后得到的wide_df格式如下:
| Well | Drug1_conc | Drug2_conc | Drug3_conc |
|---|---|---|---|
| A1 | 0.5 | 0.25 | 0.1 |
| B1 | 0.5 | 0.25 | 0 |
替代方法:使用pivot+fillna
如果数据中不存在同一Well+Drug的重复行,也可以用pivot后手动填充0:
wide_df = df.pivot(index="Well", columns="Drug", values="Drug_Conc").fillna(0).reset_index() wide_df.columns = ["Well", "Drug1_conc", "Drug2_conc", "Drug3_conc"]
内容的提问来源于stack exchange,提问作者LinearParadox
相关产品推荐
相关产品推荐

