2017-04-21 7 views
1

ネストされたループを使用せずにこれを行うには、離れていなければなりません。Dataframe列の内容を新しい列に展開する

私は最終的に、私はそれぞれのCOLがあるように、カラム内のリストの中の値から「拡大」したいDF(文字列のリストを持つ列があります注意してください)

df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5], 'C' : [['a','b'],['b','c'] ,['g','h'],['x','y']]}) 

を持っています可能なリストアイテムであり、各行に対して、その値が表示される場合は、正しい列に1があります。例えば

あなたが pandas.get_dummiesを使用したが、その後 columnsと集計 maxによって groupbyを必要とすることができます
df = 

A B  C  a b c g h x y 
5 1 ['a','b'] 1 1 
6 2 ['b','c']  1 1 
3 3 ['g','h']   1 1 
4 5 ['x','y']     1 1 

答えて

1

df1 = pd.get_dummies(pd.DataFrame(df.C.values.tolist()), prefix='', prefix_sep='') 
     .groupby(axis=1, level=0).max() 

df1 = pd.concat([df, df1], axis=1) 
print (df1) 

    A B  C a b c g h x y 
0 5 1 [a, b] 1 1 0 0 0 0 0 
1 6 2 [b, c] 0 1 1 0 0 0 0 
2 3 3 [g, h] 0 0 0 1 1 0 0 
3 4 5 [x, y] 0 0 0 0 0 1 1 

replace + str.get_dummiesを持つ別の解決策:

df1 = df.C.astype(str).replace(['\[','\]', "'", "\s+"], '', regex=True).str.get_dummies(',') 
df1 = pd.concat([df, df1], axis=1) 
print (df1) 

    A B  C a b c g h x y 
0 5 1 [a, b] 1 1 0 0 0 0 0 
1 6 2 [b, c] 0 1 1 0 0 0 0 
2 3 3 [g, h] 0 0 0 1 1 0 0 
3 4 5 [x, y] 0 0 0 0 0 1 1 

も削除0可能ですが、数値といくつかのパンダ関数cで文字列値を取得する壊れている:

df1 = df.C.astype(str).replace(['\[','\]', "'", "\s+"], '', regex=True).str.get_dummies(',') 
df1 = df1.replace(0,'') 
df1 = pd.concat([df, df1], axis=1) 
print (df1) 
    A B  C a b c g h x y 
0 5 1 [a, b] 1 1    
1 6 2 [b, c]  1 1    
2 3 3 [g, h]   1 1  
3 4 5 [x, y]     1 1 
+0

素晴らしいです!できます。とにかくそれを「インプレース」にするためにそこにはあります。私が操作しようとしているデータフレームは〜20GBです。 –

+0

'get_dummies'は複雑な関数なので、残念ながら私はあなたを助けません。 「20GB」は本当に大きなdfです:( – jezrael

+0

ありがとうございます。あまりにも大きいです。私はそれを分解し、それを食べるかもしれませんまたはそれを現在の構造でデータを使用する際にもっときれいになるでしょう。 –

関連する問題