У меня есть следующий набор данных

Chr     Position       Name      AD                                 
1       866511          A       13,21
1       881627          A       28,33
2       1599812         B       67,25 

Мне нужно разделить столбец AD на три столбца [REF, ALT1, ALT2]. Когда для каждой строки в AD есть только два значения, мне все еще нужен столбец ALT2, заполненный значением NaN.

Следующий код работает, если AD содержит строки с тремя значениями

df['REF'], df['ALT1'], df['ALT2'] = df['AD'].str.split(',', 2).str

Однако в некоторых случаях для каждой строки набор данных содержит только два значения в столбце AD, и когда я запускаю одну и ту же строку, я получаю следующее сообщение об ошибке:

ValueError: not enough values to unpack (expected 3, got 2)

В этом случае я бы хотел иметь третий столбец ALT2 и заполнить его значениями NaN. Любое предложение? Спасибо всем, кто готов помочь.

2
Gabriella Galatà 25 Июн 2019 в 19:18

3 ответа

Лучший ответ

add дополнительный ','

df['REF'], df['ALT1'], df['ALT2'] = zip(*df.AD.add(',').str.split(',').str[:3])

df

   Chr  Position Name        AD REF ALT1 ALT2
0    1    866511    A     13,21  13   21     
1    1    881627    A  28,33,31  28   33   31
2    2   1599812    B     67,25  67   25     

Или без изменения df

df.assign(**dict(zip('REF ALT1 ALT2'.split(), zip(*df.AD.add(',').str.split(',').str[:3]))))

   Chr  Position Name        AD REF ALT1 ALT2
0    1    866511    A     13,21  13   21     
1    1    881627    A  28,33,31  28   33   31
2    2   1599812    B     67,25  67   25     
2
piRSquared 25 Июн 2019 в 16:37

Вы можете установить параметр expand в True, а затем выполнить работу с:

df['REF'], df['ALT1'], df['ALT2'] = df.AD.str.split(',', 2, expand=True).values.T

Я добавил строку с 3 значениями в столбец AD с df.loc[3,:] = [3,5432,'C', '32,45,65'], и вы получите:

   Chr   Position Name        AD REF ALT1  ALT2
0  1.0   866511.0    A     13,21  13   21  None
1  1.0   881627.0    A     28,33  28   33  None
2  2.0  1599812.0    B     67,25  67   25  None
3  3.0     5432.0    C  32,45,65  32   45    65
1
Ben.T 25 Июн 2019 в 16:32

Вы можете сделать rename и concat:

df = pd.concat((df, df['AD'].str.split(',', expand=True)
                            .rename(columns={0:'REF',1:'ALT1',2:'ALT2'})
               ), axis=1)

Выход:

   Chr  Position Name     AD REF ALT1
0    1    866511    A  13,21  13   21
1    1    881627    A  28,33  28   33
2    2   1599812    B  67,25  67   25
0
Quang Hoang 25 Июн 2019 в 16:53