美好的一天
我有一本这样的字典:
dict_one = {M:[1, 3, 5, 10, 12, 14], A:[2, 4, 6, 7, 9, 11, 13, 15]}
我希望将字典映射到具有键内部受尊重值的数据框。但是,我希望将键M和A转换为二进制数,其中M = 1和A = 0并将它们放在这样的新列中。新的映射列应基于“对象”列(这是现有数据帧中已存在的列)映射新值。
object new_column
1 1
2 0
3 1
4 0
5 1
6 0
我该怎么做?帮助将不胜感激。 谢谢
答案 0 :(得分:2)
我们可以只使用np.where
np.where(df.object.isin(dict_one['A']),0,1)
Out[690]: array([1, 0, 1, 0, 1, 0])
答案 1 :(得分:1)
您可以使用列表推导来创建数据框,然后使用map
:
df = (pd.DataFrame([(x,key) for key,i in dict_one.items() for x in i],
columns=['object', 'new_column'])
.sort_values('object'))
df['new_column'] = df.new_column.map({'M':1,'A':0})
>>> df
object new_column
0 1 1
6 2 0
1 3 1
7 4 0
2 5 1
8 6 0
9 7 0
10 9 0
3 10 1
11 11 0
4 12 1
12 13 0
5 14 1
13 15 0
您甚至可以使用replace
而不是map
一次完成所有操作:
df = (pd.DataFrame([(x,key) for key,i in dict_one.items() for x in i],
columns=['object', 'new_column'])
.sort_values('object')
.replace({'new_column':{'M':1, 'A':0}}))
编辑根据您的评论,您似乎是从一个数据帧开始的,我认为它看起来像:
>>> df
object
0 1
1 2
2 3
3 4
4 5
5 6
在这种情况下,我认为您最好的选择是创建一个新的映射字典,然后使用map
:
new_dict = {x:(1 if key=='M' else 0) for key, i in dict_one.items() for x in i}
# {1: 1, 3: 1, 5: 1, 10: 1, 12: 1, 14: 1, 2: 0, 4: 0, 6: 0, 7: 0, 9: 0, 11: 0, 13: 0, 15: 0}
df['new_column'] = df.object.map(new_dict)
>>> df
object new_column
0 1 1
1 2 0
2 3 1
3 4 0
4 5 1
5 6 0