Pandas 从长到宽
Pandas long to wide
使用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
,但我希望单元格值填充 "greatest" type
根据 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
中强加的层次结构
投射时,如何控制单元格值?
您可以使用 pivot_table
,它提供了一个 aggfun
方法来聚合重复的 index-column 值;将关键词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')
使用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
,但我希望单元格值填充 "greatest" type
根据 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
投射时,如何控制单元格值?
您可以使用 pivot_table
,它提供了一个 aggfun
方法来聚合重复的 index-column 值;将关键词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')