首页 > 解决方案 > 当一列在熊猫中有两个变量值时,如何融化数据框?

问题描述

我有一个描述试卷的数据集。我想将其与学生获得的分数进行映射并进行一些分析。为此,我想融化试卷的细节。

 Question   Marks   BL  PI  CO  PSO PO
0   Q1  2   2   1.4 1   1   1,2
1   Q2  2   3   2.1 2   1   1,2
2   Q3  2   2   1.1 1   1   1,2
3   Q4  2   2   1.1 1   1   1,2
4   Q5  4   2   1.1 1   1   1,2

我试过了

qns = pd.read_csv('https://raw.githubusercontent.com/davidrajdgl/CodeSnippets/master/questions.tsv', sep="\t")
qns_melted = qns.melt(id_vars = ["Question", "Marks"])
qns_melted

但这似乎没有帮助,因为我希望通过拆分列来生成值列,其中单元格值中有一个逗号。

例如,

Q1  2   PO  1
Q1  2   PO  2

如何做到这一点?

标签: pythonpandaspivot-tablemelt

解决方案


一种可能的选择是:

  • 将PO列拆分为 2 个新列,
  • 根据需要重命名它们,
  • 删除原始PO列。

要执行此操作,请运行:

qns = qns.join(qns.PO.str.split(',', expand=True)\
    .rename(columns={0: 'PO_1', 1: 'PO_2'})).drop(columns='PO')

然后你可以融化这个DataFrame。

编辑

如果PO列中“段”的数量可以变化,则只需稍作更改。不要按名称重命名“新”列,而是添加前缀:

qns = qns.join(qns.PO.str.split(',', expand=True)\
    .add_prefix('PO_')).drop(columns='PO')

但请注意,这次有些列可以有None值,因此要将它们从熔化结果中排除,请将.dropna()添加到熔化指令:

qns.melt(id_vars = ["Question", "Marks"]).dropna()

推荐阅读