【问题标题】:Pandas long to wide熊猫从长到宽
【发布时间】:2017-07-07 17:43:11
【问题描述】:

使用 pandas,我想将长数据框转换为宽数据框,但通常的 pivot 方法没有我需要的灵活。

这是长数据:

raw = {
'sample':[1, 1, 1, 1, 2, 2, 3, 3, 3, 3],
'gene':['G1', 'G2', 'G3', 'G3', 'G1', 'G2', 'G2', 'G2', 'G3', 'G3'],
'type':['HIGH', 'HIGH', 'LOW', 'MED', 'HIGH', 'LOW', 'LOW', 'LOW', 'MED', 'LOW']}
df = pd.DataFrame(raw)`

产生

gene  sample  type
G1       1  HIGH
G2       1  HIGH
G3       1   LOW
G3       1   MED
G1       2  HIGH
G2       2   LOW
G2       3   LOW
G2       3   LOW
G3       3   MED
G3       3   LOW

我想要的是一个数据框,其行为gene,列为sample,但我希望单元格值根据HIGH 填充为“最大”type > MED > LOW > NONE 应该是这样的

casted = {
'gene':['G1', 'G2', 'G3'],
'1':['HIGH', 'HIGH', 'MED'],
'2':['HIGH', 'LOW', 'NONE'],
'3':['NONE', 'LOW', 'MED']
}
dfCast = pd.DataFrame(casted)

这让

1     2     3      gene
HIGH  HIGH  NONE   G1
HIGH  LOW   LOW    G2
MED   NONE  MED    G3

琐碎而错误地,我的长到宽命令看起来像

df = df.pivot(index='gene', columns = 'sample', values='type')

但这当然不能解释我想在HIGH>MED>LOW>NONE施加的层次结构

投射时,如何控制单元格的值是多少?

【问题讨论】:

    标签: python pandas casting melt


    【解决方案1】:

    您可以使用pivot_table 提供aggfun 方法来聚合重复的索引列值;要将关键字HIGH,MED,LOW按您需要的顺序排序,请将它们设置为字典的键,其值按单调顺序排列,并以min/max作为聚合函数选择极值:

    cat = {"HIGH": 3, "MED": 2, "LOW": 1}
    df.pivot_table("type", "gene", "sample", aggfunc=lambda x: max(x, key=cat.get))
    


    或者另一种选择,将 type 转换为有序分类数据类型,然后使用pivot_table:

    df['type'] = pd.Categorical(df['type'], ["LOW", "MED", "HIGH"], ordered=True)
    df.pivot_table("type", "gene", "sample", aggfunc='max')
    

    【讨论】:

    • 非常有帮助和干净。谢谢!
    猜你喜欢
    • 2021-09-04
    • 2021-02-09
    • 2014-05-12
    • 2020-08-06
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多