通过字典通过系列映射创建新的二进制列

时间:2018-07-08 01:45:40

标签: python pandas dataframe data-structures

美好的一天

我有一本这样的字典:

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

我该怎么做?帮助将不胜感激。 谢谢

2 个答案:

答案 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