将字典的值拆分为单独的熊猫数据框列——使它们成为虚拟的
split values of a dictionary into seperate panda dataframe columns -- make them dummy
假设我们有一个这种格式的数据框:
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
使用itertools.chain.from_iterable
and 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
使用 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
我会用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
Set_index 到 id
。正如您所说,每个单元格都是一个字符串,因此您需要使用 ast.literal_eval
将 df.properties
从 dict 的字符串转换为 dict。接下来,使用 str
方法获取 cat1
和 cat2
并将它们的列表和 explode
组合到行并将结果分配给 s
。最后,使用选项 dtype=bool
在 s
上调用 pd.get_dummies
并在 level=0
上调用 max
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
假设我们有一个这种格式的数据框:
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
使用itertools.chain.from_iterable
and 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
使用 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
我会用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
Set_index 到 id
。正如您所说,每个单元格都是一个字符串,因此您需要使用 ast.literal_eval
将 df.properties
从 dict 的字符串转换为 dict。接下来,使用 str
方法获取 cat1
和 cat2
并将它们的列表和 explode
组合到行并将结果分配给 s
。最后,使用选项 dtype=bool
在 s
上调用 pd.get_dummies
并在 level=0
max
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