为了账号安全,请及时绑定邮箱和手机立即绑定

将字典的值拆分为单独的 panda 数据框列——使它们成为虚拟列

将字典的值拆分为单独的 panda 数据框列——使它们成为虚拟列

慕侠2389804 2022-06-14 15:27:13
假设我们有一个这种格式的数据框:id  properties0   {"cat1":["p1","p2","p4"],"cat2":["p5", "p6"]}1   {"cat1":["p3"],"cat2":["p7"]}我们如何将其转换为这种格式?id  p1    p2    p3    p4    p5    p6    p70   True  True  False True  True  True  False1   False False True  False False False True请记住,每个单元格中的值类型是字符串。它只有两个类别:cat1 和 cat2
查看完整描述

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


查看完整回答
反对 回复 2022-06-14
?
翻阅古今

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


查看完整回答
反对 回复 2022-06-14
?
MMTTMM

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


查看完整回答
反对 回复 2022-06-14
?
12345678_0001

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


查看完整回答
反对 回复 2022-06-14
  • 4 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信