2015-10-15 2 views
2

Я хочу закодировать скрипт, который принимает значения из столбца, разделяет их на строки и создает новый столбец для каждой из полученных строк (заполняется NaN прямо сейчас). Как ФР groupedby Column1, я хочу сделать это для каждой группыКак добавить новые столбцы в объект pandas groupby из списка значений

Мой входной кадр данных выглядит следующим образом:

df1: 
     Column1 Column2 
    0 L17  a,b,c,d,e 
    1 L7  a,b,c 
    2 L6  a,b,f 
    3 L6  h,d,e 

То, что я, наконец, хочу иметь это:

 Column1 Column2  a b c d e f h 
    0 L17  a,b,c,d,e nan nan nan nan nan nan nan 
    1 L7  a,b,c  nan nan nan nan nan nan nan 
    2 L6  a,b,f  nan nan nan nan nan nan nan 

Мои код в настоящее время выглядит так:

def NewCols(x): 
    for item, frame in group['Column2'].iteritems(): 
     Genes = frame.split(',') 
     for value in Genes: 
      string = value 
      x[string] = np.nan 
      return x 

df1.groupby('Column1').apply(NewCols) 

Моя мысль о том, что код зацикливается грубая колонка 2 каждого сгруппированного объекта, разделяя значения, содержащиеся в frame, на запятую и создавая список для этой группы. Пока код работает нормально. Затем я добавил

for value in Genes: 
    string = value 
    x[string] = np.nan 
    return x 

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

Column1 Column2 d 
0 L17  a,b,c,d,e nan 
1 L7  a,b,c  nan 
2 L6  a,b,f  nan 
3 L6  h,d,e  nan 

и я в значительной степени поражен немым. Может кто-нибудь объяснить, почему добавляется только один столбец (который даже не назван в честь первого значения в первом списке первой группы) и предлагает, как я мог бы улучшить свой код?

ответ

2

Я думаю, что вы просто return слишком рано в своей функции, перед концом двух петель. Если вы отступаете назад два раза:

def NewCols(x): 
    for item, frame in group['Column2'].iteritems(): 
     Genes = frame.split(',') 
     for value in Genes: 
      string = value 
      x[string] = np.nan 
    return x 

UngroupedResGenesLineage.groupby('Column1').apply(NewCols) 

Должно работать нормально!

+0

О, человек ... спасибо! : D –

+0

Добро пожаловать :) – Mathiou

1
cols = sorted(list(set(df1['Column2'].apply(lambda x: x.split(',')).sum()))) 
df = df1.groupby('Column1').agg(lambda x: ','.join(x)).reset_index() 
pd.concat([df,pd.DataFrame({c:np.nan for c in cols}, index=df.index)], axis=1) 

    Column1 Column2  a b c d e f h 
0 L17  a,b,c,d,e NaN NaN NaN NaN NaN NaN NaN 
1 L6  a,b,f,h,d,e NaN NaN NaN NaN NaN NaN NaN 
2 L7  a,b,c  NaN NaN NaN NaN NaN NaN NaN 
Смежные вопросы