Python基于逗号分隔的字符向量列的值来熔化数据帧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基于逗号分隔的字符向量列的值来熔化数据帧相关的知识,希望对你有一定的参考价值。
我目前正在进行测试,其中我有不同的区域和一些相关的统计数据,以及位于这些区域的逗号分隔的基因列表。此列表的编号可变,并且可能不包含任何内容("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
答案
使用:
# 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
另一答案
使用下面的代码,使用stack
来堆叠它,然后在', '
上拆分,然后再堆叠,因为我们将它堆叠两次,使用unstack
与-2
卸载,然后使用reset_index
-1
重置索引,之后做最后的reset_index
没有参数:
print(df.set_index(['region_id', 'statistic'])
.stack()
.str.split(', ', expand=True)
.stack()
.unstack(-2)
.reset_index(-1, drop=True)
.reset_index()
)
另一答案
使用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()
以上是关于Python基于逗号分隔的字符向量列的值来熔化数据帧的主要内容,如果未能解决你的问题,请参考以下文章