熊猫长到宽阔

时间:2017-02-18 03:36:27

标签: python pandas casting melt

使用pandas,我想将长数据帧转换为宽数据,但通常的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,列为type,但我希望单元格值填充"最大"根据{{​​1}}> HIGH 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

在投射时,我该如何控制细胞值是什么?

1 个答案:

答案 0 :(得分: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))

enter image description here

或其他选项,将类型转换为有序分类数据类型,然后使用pivot_table

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

enter image description here