【问题标题】:How to melt dataframe when a column has two values for a variable in pandas?当一列在熊猫中有两个变量值时,如何融化数据框?
【发布时间】:2019-11-17 09:58:37
【问题描述】:

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

 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

如何做到这一点?

【问题讨论】:

  • 为什么您的数据框中的 PO 值为 1,2 而您的预期输出为 2?
  • @ansev 我只想要那种方式...因为,我需要再次按所有类别分组,然后再次在内部...比如“PO”是程序目标,1 和 2 代表这个 q2 属于 PO 1 和 PO 2。所以我需要这些信息 inf long 格式与学生标记每个问题的详细信息合并,然后进行分析。
  • 融了之后,能不能不.str.split(',').explode()你的值栏?
  • (虽然你可能希望最终得到类似的东西:m = df.set_index(['Question', 'Marks']).melt()then split/explode 相应地
  • @JonClements 我收到此代码错误:'Series' object has no attribute 'explode'

标签: python pandas pivot-table melt


【解决方案1】:

可能的选项之一是:

  • 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 值,因此要排除 他们从 melt 结果,添加 .dropna()melt 指令:

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

【讨论】:

  • 除了重命名部分之外,这将起作用,因为我必须动态重命名它。因为,我不知道数据集中会有多少 PO_n。我们能做些什么呢?
  • 太棒了......这完全有帮助......非常感谢......最后我只需要用空字符串删除“_ [0-9] *”以获得我想要的东西。再次感谢......你拯救了我的一天......
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多