我目前正在测试中,我在不同的区域具有一些相关的统计信息,并且用逗号分隔这些区域中的基因列表。此列表的数量将是可变的,并且可能不包含任何内容("NA"
)。
如何“融化”此数据框:
region_id statistic genelist
1 2.5 A, B, C
2 0.5 B, C, D, E
3 3.2 <NA>
4 0.1 E, F
变成这样:
region_id statistic gene
1 2.5 A
1 2.5 B
1 2.5 C
2 0.5 B
2 0.5 C
2 0.5 D
2 0.5 E
3 3.2 <NA>
4 0.1 E
4 0.1 F
答案 0 :(得分:7)
使用以下代码,使用stack
对其进行堆叠,在', '
上拆分之后,再对其进行堆叠,因为我们将其堆叠了两次,请使用unstack
将{{ 1}},然后使用-2
和reset_index
重置索引,之后再执行不带参数的最终-1
:
reset_index
答案 1 :(得分:5)
使用:
# Splitting on , and joining with region_id and statistic columns
val = pd.concat([df.region_id,
df.statistic,
df.genelist.str.split(',', expand=True)],
axis=1)
# Unpivoting and ignoring variable column
m = pd.melt(val, id_vars=['region_id', 'statistic'])\
.loc[:, ['region_id', 'statistic', 'value']]
# Ignoring Null values and sorting based on region_id
m[m.value.notnull()]\
.sort_values('region_id')\
.reset_index(drop=True)\
.rename(columns={'value':'gene'})
region_id statistic gene
1 2.5 A
1 2.5 B
1 2.5 C
2 0.5 B
2 0.5 C
2 0.5 D
2 0.5 E
3 3.2 <NA>
4 0.1 E
4 0.1 F
答案 2 :(得分:3)
使用stack
df=df.join(df.pop('genelist').str.split(',',expand=True))
df.set_index(['region_id','statistic']).stack().reset_index(level=[0,1],name='gene')
使用melt
df=df.join(df.pop('genelist').str.split(',',expand=True))
pd.melt(df,id_vars=['region_id','statistic'],value_name='gene').dropna()
答案 3 :(得分:1)
您也可以使用df.assign
和explode
来做到这一点。假定数据为列表格式,则爆炸用于将列数据分成多行。
可以将基因列表中的每个数据转换为列表,使用逗号将其分隔,然后在基因列表列上使用explode。
(df.assign(genelist=df.genelist.str.split(',')).explode('genelist'))