熊猫:爆炸数组列成一系列的二进制列?

时间:2018-11-02 13:18:41

标签: pandas

给出如下数据:

df = pd.DataFrame([
    { 'vals': ['foo', 'bar'], 'id': 100 },
    { 'vals': ['foo', 'bar', 'baz'], 'id': 101 },
    { 'vals': ['bar'], 'id': 102 },
    { 'vals': ['foo'], 'id': 103 }  
])

有什么办法可以使它成为这样的数据帧:

id    foo    bar    baz
100   true   true   false
101   true   true   true
102   false  true   false
103   true   false  false

3 个答案:

答案 0 :(得分:3)

使用MultiLabelBinarizer进行强制转换为布尔值,并将join的所有列(不包含由pop提取的vals

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df =df.join(pd.DataFrame(mlb.fit_transform(df.pop('vals')),columns=mlb.classes_).astype(bool))
print (df)

    id    bar    baz    foo
0  100   True  False   True
1  101   True   True   True
2  102   True  False  False
3  103  False  False   True

答案 1 :(得分:0)

df = df.set_index(['id']).vals.apply(pd.Series).stack().reset_index(level=-1, drop=True).reset_index()
df = df.merge(pd.get_dummies(df[0]), right_index=True, left_index=True).drop(0, axis=1)
df = df.groupby('id').sum()

答案 2 :(得分:0)

使用get_dummies

df.set_index('id').vals.map(','.join).str.get_dummies(',').astype(bool)
Out[8]: 
       bar    baz    foo
id                      
100   True  False   True
101   True   True   True
102   True  False  False
103  False  False   True