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

假设我们有一个这种格式的数据框:


id  properties

0   {"cat1":["p1","p2","p4"],"cat2":["p5", "p6"]}

1   {"cat1":["p3"],"cat2":["p7"]}

我们如何将其转换为这种格式?


id  p1    p2    p3    p4    p5    p6    p7

0   True  True  False True  True  True  False

1   False False True  False False False True

请记住,每个单元格中的值类型是字符串。它只有两个类别:cat1 和 cat2


慕侠2389804
浏览 111回答 4
4回答

鸿蒙传说

使用itertools.chain.from_iterable和str.get_dummiesfrom itertools import chaindf.properties.apply(lambda s: ','.join(chain.from_iterable(s.values())))\             .str.get_dummies(sep=',')\             .astype(bool)      p1     p2     p3     p4     p5     p6     p70   True   True  False   True   True   True  False1  False  False   True  False  False  False   True

翻阅古今

我会用get_dummiesdf.properties.map(lambda x : ','.join(sum(x.values(),[]))).str.get_dummies(',').astype(bool)      p1     p2     p3     p4     p5     p6     p70   True   True  False   True   True   True  False1  False  False   True  False  False  False   True

MMTTMM

使用stack+ explode+get_dummiesu = pd.DataFrame(df['properties'].tolist())u.stack().explode().add(',').sum(level=0).str.get_dummies(',')   p1  p2  p3  p4  p5  p6  p70   1   1   0   1   1   1   01   0   0   1   0   0   0   1

12345678_0001

将_index 设置为id. 正如您所说,每个单元格都是一个字符串,因此您需要df.properties使用ast.literal_eval. 接下来,使用str方法获取cat1并将cat2它们的列表和explode它们组合到行并将结果分配给s. 最后,pd.get_dummies使用s选项dtype=bool调用并调用maxlevel=0import astdf1 = 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     p7id0   True   True   False  True   True   True   False1   False  False  True   False  False  False  True
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python