2016-02-18 2 views
2

У меня проблема с методом assign, когда я хочу создать новый столбец из раскола другого столбца. Если я выберу значение метода split, я получу ошибку ValueError: длина значений не соответствует длине индекса. Если я просто применяю split, не выбирая (индекс) любое значение, я получаю новый столбец со списком внутри.Python метод pandas chaining: назначить столбец из strsplit

Вот выход, если я не индексируют выход метода разделенного

(
    pd.DataFrame({ 
     "Gene": ["G1", "G1", "G2", "G2"], 
     "Sample": ["H1_T1", "H2_T1", "H1_T1", "H2_T1"] 
    }) 
    .assign(Timepoint = lambda x: x.Sample.str.split("_")[1]) 
) 
    Gene Sample Timepoint 
0 G1 H1_T1 [H1, T1] 
1 G1 H2_T1 [H2, T1] 
2 G2 H1_T1 [H1, T1] 
3 G2 H2_T1 [H2, T1] 

Ниже приведен пример, где я хотел бы, чтобы выбрать T1 или значение T2 из колонки образца и выдает ошибку:

(
    pd.DataFrame({ 
     "Gene": ["G1", "G1", "G2", "G2"], 
     "Sample": ["H1_T1", "H2_T1", "H1_T1", "H2_T1"] 
    }) 
    .assign(Timepoint = lambda x: x.Sample.str.split("_")[1]) 
) 

ошибка, я получаю от этого:

/home/user/anaconda3/lib/python3.4/site-packages/pandas/core/series.py in _sanitize_index(data, index, copy) 
    2739 
    2740  if len(data) != len(index): 
-> 2741   raise ValueError('Length of values does not match length of ' 
    2742       'index') 
    2743 

ValueError: Length of values does not match length of index 

ответ

1

IIUC, то вы хотите дополнительный вызов str для выбора элементов:

In [234]: 
pd.DataFrame({ 
     "Gene": ["G1", "G1", "G2", "G2"], 
     "Sample": ["H1_T1", "H2_T1", "H1_T1", "H2_T1"] 
    }).assign(Timepoint = lambda x: x.Sample.str.split("_").str[1]) 

Out[234]: 
    Gene Sample Timepoint 
0 G1 H1_T1  T1 
1 G1 H2_T1  T1 
2 G2 H1_T1  T1 
3 G2 H2_T1  T1 

Если немного изменить свой ФР и увидеть выход

In [237]: 
df = pd.DataFrame({ 
     "Gene": ["G1", "G1", "G2", "G2"], 
     "Sample": ["H1_T1", "H2_T2", "H1_T3", "H2_T4"] 
    }) 

df['Sample'].str.split("_") 

Out[237]: 
0 [H1, T1] 
1 [H2, T2] 
2 [H1, T3] 
3 [H2, T4] 
dtype: object 

Так что вы попытались было следующее:

In [238]: 
df['Sample'].str.split("_")[1] 

Out[238]: 
['H2', 'T2'] 

You может видеть, что это было, чтобы выбрать вторую строку, вам нужно выбрать второй элемент каждой строки:

In [239]: 
df['Sample'].str.split("_").str[1] 

Out[239]: 
0 T1 
1 T2 
2 T3 
3 T4 
dtype: object 
+0

Wow, ok - Спасибо за решение! Я не понимаю, почему сложно .. – dmeu

+0

OK обновится с объяснением – EdChum

+0

Aha - Я вижу, спасибо за объяснение @EdChum! Я был уверен, что функция (split) выполняется для каждой строки, а не для всего кадра данных. Благодаря! – dmeu

Смежные вопросы