2016-05-06 4 views
3

カテゴリデータの3つの列をバイナリカテゴリ名の列の単一のセットに結合する必要があります。これは "ワンホット"に似ていますが、ソース行には1つではなく3つのカテゴリがあります。また、100以上のカテゴリがあり、私はそれらをあらかじめ知っていないことに注意してください。Python/Pandasで「たくさんのホット」を構築するには?

id, fruit1, fruit2, fruit3 
1, apple, orange, 
2, orange, , 
3, banana, apple, 

生成する必要があります...

id, apple, banana, orange 
1, 1, 0, 1 
2, 0, 0, 1 
3, 1, 1, 0 
あなたが各行に値のカウントを適用することができます

答えて

1

あなたが1列にすべての果物の列を結合するpd.meltを使用し、周波数テーブルを作成するために使用pd.crosstabできます

import numpy as np 
import pandas as pd 

df = pd.read_csv('data') 
df = df.replace(r' ', np.nan) 
# id fruit1 fruit2 fruit3 
# 0 1 apple orange  NaN 
# 1 2 orange  NaN  NaN 
# 2 3 banana apple  NaN 

melted = pd.melt(df, id_vars=['id']) 
result = pd.crosstab(melted['id'], melted['value']) 
print(result) 

利回り

value apple banana orange 
id        
1   1  0  1 
2   0  0  1 
3   1  1  0 

説明:溶けたDataFrameは次のようになります:

In [148]: melted = pd.melt(df, id_vars=['id']); melted 
Out[149]: 
    id variable value 
0 1 fruit1 apple 
1 2 fruit1 orange 
2 3 fruit1 banana 
3 1 fruit2 orange 
4 2 fruit2  NaN 
5 3 fruit2 apple 
6 1 fruit3  NaN 
7 2 fruit3  NaN 
8 3 fruit3  NaN 

variableの列は無視できます。重要なのはidvalueです。 pd.crosstab列としてインデックスにmelted['id']値とmelted['value']値を有する頻度テーブルを作成するために使用することができる。

In [150]: pd.crosstab(melted['id'], melted['value']) 
Out[150]: 
value apple banana orange 
id        
1   1  0  1 
2   0  0  1 
3   1  1  0 
0

import pandas as pd 
import numpy as np 

df = pd.DataFrame({ 
    'fruit1': ['Apple', 'Banana', np.nan], 
    'fruit2': ['Banana', np.nan, 'Apple'], 
    'fruit3': ['Grape', np.nan, np.nan], 
    }) 

df = df.apply(lambda row: row.value_counts(), axis=1).fillna(0).applymap(int) 

前:

fruit1 fruit2 fruit3 
0 Apple Banana Grape 
1 Banana  NaN NaN 
2  NaN Apple NaN 

後:

Apple Banana Grape 
0  1  1  1 
1  0  1  0 
2  1  0  0 
関連する問題