Python基于逗号分隔的字符向量列的值融化数据框

时间:2019-03-06 05:59:10

标签: python pandas dataframe

我目前正在测试中,我在不同的区域具有一些相关的统计信息,并且用逗号分隔这些区域中的基因列表。此列表的数量将是可变的,并且可能不包含任何内容("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

4 个答案:

答案 0 :(得分:7)

使用以下代码,使用stack对其进行堆叠,在', '上拆分之后,再对其进行堆叠,因为我们将其堆叠了两次,请使用unstack将{{ 1}},然后使用-2reset_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.assignexplode来做到这一点。假定数据为列表格式,则爆炸用于将列数据分成多行。 可以将基因列表中的每个数据转换为列表,使用逗号将其分隔,然后在基因列表列上使用explode。

(df.assign(genelist=df.genelist.str.split(',')).explode('genelist'))