Структура данных расплавления Python, основанная на значениях символьного вектора-столбца, разделенных запятыми - PullRequest
1 голос
/ 06 марта 2019

В настоящее время я работаю над тестом, в котором у меня есть разные регионы с некоторой связанной статистикой, а также список разделенных запятыми генов, которые лежат в этих регионах. Этот список будет переменным по номеру и может не содержать ничего ("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

Ответы [ 3 ]

7 голосов
/ 06 марта 2019

Используйте приведенный ниже код, используйте 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()
)
5 голосов
/ 06 марта 2019

Использование:

# 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
3 голосов
/ 06 марта 2019

используя стек

df=df.join(df.pop('genelist').str.split(',',expand=True))
df.set_index(['region_id','statistic']).stack().reset_index(level=[0,1],name='gene')

используя расплав

df=df.join(df.pop('genelist').str.split(',',expand=True))
pd.melt(df,id_vars=['region_id','statistic'],value_name='gene').dropna()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...