使用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
在投射时,我该如何控制细胞值是什么?
答案 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))
或其他选项,将类型转换为有序分类数据类型,然后使用pivot_table
:
df['type'] = pd.Categorical(df['type'], ["LOW", "MED", "HIGH"], ordered=True)
df.pivot_table("type", "gene", "sample", aggfunc='max')