给出如下数据:
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
答案 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