如何在pandas数据框中传播一列
我有以下pandas数据框架:
import pandas as pd import numpy as np df = pd.DataFrame({ 'fc': [100,100,112,1.3,14,125], 'sample_id': ['S1','S1','S1','S2','S2','S2'], 'gene_symbol': ['a', 'b', 'c', 'a', 'b', 'c'], }) df = df[['gene_symbol', 'sample_id', 'fc']] df
这产生这个:
Out[11]: gene_symbol sample_id fc 0 a S1 100.0 1 b S1 100.0 2 c S1 112.0 3 a S2 1.3 4 b S2 14.0 5 c S2 125.0
我怎么能传播sample_id
以便最终我得到这个:
gene_symbol S1 S2 a 100 1.3 b 100 14.0 c 112 125.0
使用pivot
或不unstack
:
#df = df[['gene_symbol', 'sample_id', 'fc']] df = df.pivot(index='gene_symbol',columns='sample_id',values='fc') print (df) sample_id S1 S2 gene_symbol a 100.0 1.3 b 100.0 14.0 c 112.0 125.0
df = df.set_index(['gene_symbol','sample_id'])['fc'].unstack(fill_value=0) print (df) sample_id S1 S2 gene_symbol a 100.0 1.3 b 100.0 14.0 c 112.0 125.0
但是,如果重复,需要pivot_table
或与groupby
或聚合, mean
可以改为sum
, median
,…:
df = pd.DataFrame({ 'fc': [100,100,112,1.3,14,125, 100], 'sample_id': ['S1','S1','S1','S2','S2','S2', 'S2'], 'gene_symbol': ['a', 'b', 'c', 'a', 'b', 'c', 'c'], }) print (df) fc gene_symbol sample_id 0 100.0 a S1 1 100.0 b S1 2 112.0 c S1 3 1.3 a S2 4 14.0 b S2 5 125.0 c S2 <- same c, S2, different fc 6 100.0 c S2 <- same c, S2, different fc
df = df.pivot(index='gene_symbol',columns='sample_id',values='fc')
ValueError:索引包含重复的项目,不能重塑
df = df.pivot_table(index='gene_symbol',columns='sample_id',values='fc', aggfunc='mean') print (df) sample_id S1 S2 gene_symbol a 100.0 1.3 b 100.0 14.0 c 112.0 112.5
df = df.groupby(['gene_symbol','sample_id'])['fc'].mean().unstack(fill_value=0) print (df) sample_id S1 S2 gene_symbol a 100.0 1.3 b 100.0 14.0 c 112.0 112.5
编辑:
清理时将columns name
设置为None
和reset_index
:
df.columns.name = None df = df.reset_index() print (df) gene_symbol S1 S2 0 a 100.0 1.3 1 b 100.0 14.0 2 c 112.0 112.5
你也可以使用pd.crosstab()方法:
In [82]: pd.crosstab(index=df.gene_symbol, columns=df.sample_id, values=df.fc, aggfunc='mean') \ ...: .rename_axis(None,1) \ ...: .reset_index() ...: Out[82]: gene_symbol S1 S2 0 a 100.0 1.3 1 b 100.0 14.0 2 c 112.0 125.0