我有一个熊猫数据框,如下所示。有一列包含元素作为项目列表,每行中项目的数量不同。我想将列表元素转换为具有布尔值的字典元素,如输出所示。最快的方法是什么?
DataFrame:
Index Value
0 [Cat,Dog,Rat]
1 [Cat,Dog,Horse]
2 [Cat,Dog,Horse,Rat]
3 [Cat,Horse,Rat]
4 [Dog,Horse,Rat]
预期输出:
Index Value
0 {'Cat':'Yes','Dog':'Yes','Horse':'No','Rat':'Yes'}
1 {'Cat':'Yes','Dog':'Yes','Horse':'Yes','Rat':'No'}
2 {'Cat':'Yes','Dog':'No','Horse':'Yes','Rat':'Yes'}
4 {'Cat':'No','Dog':'Yes','Horse':'Yes','Rat':'Yes'}
答案 0 :(得分:1)
首先,我创建一个变量,其中包含所有可能的键,称为keys
。然后
df.Value.apply(lambda x: dict((key,"Yes") if key in x else (key,"No") for key in keys))
示例输出:
>>> data = {'Value': [['Cat', 'Dog', 'Horse', 'Rat'], ['Dog', 'Horse', 'Rat']]}
>>> keys
['Cat', 'Dog', 'Horse', 'Rat']
>>> data = {'Value': [['Cat', 'Dog', 'Horse', 'Rat'], ['Dog', 'Horse', 'Rat']]}
>>> df = pd.DataFrame(data)
>>> df
Value
0 [Cat, Dog, Horse, Rat]
1 [Dog, Horse, Rat]
>>> df.Value.apply(lambda x: dict((key,"Yes") if key in x else (key,"No") for key in keys))
0 {'Rat': 'Yes', 'Cat': 'Yes', 'Dog': 'Yes', 'Ho...
1 {'Rat': 'Yes', 'Cat': 'No', 'Dog': 'Yes', 'Hor...
Name: Value, dtype: object
答案 1 :(得分:0)
具有set
对象和简单条件:
In [386]: names = set(s for lst in df['Value'].values for s in lst)
In [387]: df['Value'] = df['Value'].apply(lambda row: {n: 'Yes' if n in row else 'No' for n in names})
In [388]: df
Out[388]:
Index Value
0 0 {'Cat': 'Yes', 'Rat': 'Yes', 'Horse': 'No', 'D...
1 1 {'Cat': 'Yes', 'Rat': 'No', 'Horse': 'Yes', 'D...
2 2 {'Cat': 'Yes', 'Rat': 'Yes', 'Horse': 'Yes', '...
3 3 {'Cat': 'Yes', 'Rat': 'Yes', 'Horse': 'Yes', '...
4 4 {'Cat': 'No', 'Rat': 'Yes', 'Horse': 'Yes', 'D...