2015-10-15 83 views
2

我想編寫一個腳本,該腳本從一列中獲取系列值,將它們拆分爲字符串併爲每個結果字符串創建一個新列(填充NaN現在)。由於DF是groupedby列1,我要爲每個組如何將新列添加到值列表中的熊貓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) 

我的想法背後是代碼循環th每個分組對象的粗略Column2,以逗號分隔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