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基于逗号分隔的字符向量列的值来熔化数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何分隔列的字符串并将它们存储在向量中[重复]

有没有办法将列的值聚合和/或连接为 Group By 查询中的逗号分隔项?

将字符串中的逗号分隔数字转换为数字向量[重复]

比较来自两个不同表的两列的逗号分隔值

更新一行以基于另一行的转换 (Oracle)

CSV 解析包含双引号和逗号的字符串