4 回答
TA贡献1865条经验 获得超7个赞
使用itertools.chain.from_iterable和str.get_dummies
from itertools import chain
df.properties.apply(lambda s: ','.join(chain.from_iterable(s.values())))\
.str.get_dummies(sep=',')\
.astype(bool)
p1 p2 p3 p4 p5 p6 p7
0 True True False True True True False
1 False False True False False False True
TA贡献1780条经验 获得超5个赞
我会用get_dummies
df.properties.map(lambda x : ','.join(sum(x.values(),[]))).str.get_dummies(',').astype(bool)
p1 p2 p3 p4 p5 p6 p7
0 True True False True True True False
1 False False True False False False True
TA贡献1869条经验 获得超4个赞
使用stack+ explode+get_dummies
u = pd.DataFrame(df['properties'].tolist())
u.stack().explode().add(',').sum(level=0).str.get_dummies(',')
p1 p2 p3 p4 p5 p6 p7
0 1 1 0 1 1 1 0
1 0 0 1 0 0 0 1
TA贡献1802条经验 获得超5个赞
将_index 设置为id. 正如您所说,每个单元格都是一个字符串,因此您需要df.properties使用ast.literal_eval. 接下来,使用str方法获取cat1并将cat2它们的列表和explode它们组合到行并将结果分配给s. 最后,pd.get_dummies使用s选项dtype=bool调用并调用maxlevel=0
import ast
df1 = df.set_index('id')
df1.properties = df1.properties.map(ast.literal_eval)
s = (df1.properties.str['cat1'] + df1.properties.str['cat2']).explode()
pd.get_dummies(s, dtype=bool).max(level=0)
Out[1035]:
p1 p2 p3 p4 p5 p6 p7
id
0 True True False True True True False
1 False False True False False False True
添加回答
举报