2017-10-24 8 views
0

私はイベントデータを持つデータフレームを持っています。私は2つの列を持っています:プライマリとセカンダリ。プライマリとセカンダリの両方の列には、タグのリスト([Funイベント]、[Dance party]など)が含まれています。パンダのカスタムダミーコーディング

 primary    secondary      combined 
['booze', 'party'] ['singing', 'dance'] ['booze', 'party', 'singing', 'dance'] 
    ['concert']  ['booze', 'vocals']  ['concert', 'booze', 'vocals'] 

Iが非観察、プライマリ列は1つのコードを有するように、コードにデータをダミーする列は、0を有し、第二列の値は、0.5の値を有します。そのような:ここで

combined         booze  party singing dance concert vocals 
['booze', 'party', 'singing', 'dance']  1   1  .5  .5  0   0 
['concert', 'booze', 'vocals']   .5   0  0   0  1   .5 

答えて

1
df1=pd.get_dummies(df.combined.apply(pd.Series).stack()).sum(level=0) 
df1[df1.apply(lambda x : [x.name in y for y in df.iloc[x.index,2]])]-=0.5 

df1 
Out[173]: 
    booze concert dance party singing vocals 
0 1.0  0 0.5  1  0.5  0.0 
1 0.5  1 0.0  0  0.0  0.5 

データ入力:

df = pd.DataFrame({'primary': [['booze', 'party'] , ['concert']], 
        'secondary': [['singing', 'dance'], ['booze', 'vocals']], 
        'combined': [['booze', 'party', 'singing', 'dance'], ['concert', 'booze', 'vocals']]}) 
1

は、データフレームの列にprimarysecondaryカラムの値を変換することによって動作一つのアプローチです:

df = pd.DataFrame({ 
     'primary': [['booze', 'party'], ['concert']], 
     'secondary': [['singing', 'dance'], ['booze', 'vocals']], 
    }) 

# create primary and secondary indicator columns 
iprim = df.primary.apply(lambda v: pd.Series([1] * len(v), index=v)) 
isec = df.secondary.apply(lambda v: pd.Series([.5] * len(v), index=v)) 

# join with primary, then update from secondary columns 
df = df.join(iprim).join(isec, rsuffix='_') 
df.drop([c for c in df.columns if c.endswith('_')], axis=1, inplace=True) 
df.update(isec) 
df.fillna(0) 

=>

primary  secondary  booze concert  party  dance singing  vocals 
0 [booze, party] [singing, dance] 1.0  0.0   1.0   0.5   0.5  0.0 
1 [concert]  [booze, vocals] 0.5  1.0   0.0   0.0   0.0  0.5 

は、第二.join()に注意してください。すでにprimaryにあった列を追加するにはrsuffixを使用しますが、.update()はprimarの値を上書きするために使用されますy列。 .drop()はこれらの列を削除します。セカンダリよりプライマリを優先するように並べ替えます。