Python 熊猫长得很宽

Python 熊猫长得很宽,python,pandas,casting,melt,Python,Pandas,Casting,Melt,使用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', 'L

使用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
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
不管是琐碎的还是错误的,我从长到宽的命令看起来像

casted = {
'gene':['G1', 'G2', 'G3'],
'1':['HIGH', 'HIGH', 'MED'],
'2':['HIGH', 'LOW', 'NONE'],
'3':['NONE', 'LOW', 'MED']
}
dfCast = pd.DataFrame(casted)
df=df.pivot(index='gene',columns='sample',values='type')

但当然,这并不能解释我想在
HIGH
MED
LOW
NONE


在强制转换时,如何控制单元格值?

您可以使用
pivot\u 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))


或另一个选项,将类型转换为有序分类数据类型,然后使用
pivot\u table

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

非常有用,而且干净。非常感谢。