虚拟对象以字典值为条件

时间:2015-06-24 21:33:31

标签: python dictionary pandas

我有一个带有一堆名字的数据框

df['NAME']=['Zamboni, Clemente', 'Strada, Gino', 'Zeldina, Laura', 'Silvestri, Simone']

与键名称相同的字典,以及列表值

mydict={'Zamboni, Clemente' : [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110], 
'Strada, Gino' : [103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114], 
'Zeldina, Laura' : [111, 112, 113], 
'Silvestri, Simone' : [113]}

以及包含字典中出现的所有唯一数字的列表:

mylist = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114]

我想为mylist中的每个元素创建一个虚拟变量,如果该元素位于与该名称关联的字典值中,则该变量等于1:因此对于'Silvestri,Simone',所有虚拟对象应取值0除外为'113'。

这是我最近的尝试:

for k in df['NAME']:
    if k in mydict:
        for c in mylist:
            if c in mydict[k]:
                df[c][k] = 1
            else:
                df[k,c] = 0

任何提示都会非常感激!

2 个答案:

答案 0 :(得分:2)

我认为unutbu的答案相当优雅,但似乎没有认出113'被'Strada,Gino','Zeldina,Laura','Silvestri,Simone'分享。你可以这样修复它。

对于您的问题,关键点是您的dict暗示'Zeldina, Laura' 'Zamboni, Clemente' 'Silvestri, Simone' 'Strada, Gino'是观察值,而[100 - 114]是观察值。你想要做的事实上是另一种方式。您希望将[100 - 114]设置为观察标签,而'Zeldina, Laura' 'Zamboni, Clemente' 'Silvestri, Simone' 'Strada, Gino'是其可能的4个值。因此,转换格式的一些手动处理是不可避免的。

import pandas as pd
import numpy as np

mydict={'Zamboni, Clemente' : [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110], 
'Strada, Gino' : [103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114], 
'Zeldina, Laura' : [111, 112, 113], 
'Silvestri, Simone' : [113]}

mylist = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114]

temp = []
for _, value in mydict.items():
    temp.append(pd.Series(value, index=value).reindex(mylist))

df = pd.concat(temp, axis=1)
df.columns = list(mydict.keys())

df.apply(lambda col: np.where(col.isnull(), 0, 1))


Out[40]: 
     Zeldina, Laura  Zamboni, Clemente  Silvestri, Simone  Strada, Gino
100               0                  1                  0             0
101               0                  1                  0             0
102               0                  1                  0             0
103               0                  1                  0             1
104               0                  1                  0             1
105               0                  1                  0             1
106               0                  1                  0             1
107               0                  1                  0             1
108               0                  1                  0             1
109               0                  1                  0             1
110               0                  1                  0             1
111               1                  0                  0             1
112               1                  0                  0             1
113               1                  0                  1             1
114               0                  0                  0             1

答案 1 :(得分:0)

您可以使用df.pivot

import pandas as pd
mydict={
    'Zamboni, Clemente' : [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110], 
    'Strada, Gino' : [103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114], 
    'Zeldina, Laura' : [111, 112, 113], 
    'Silvestri, Simone' : [113]}

df = pd.DataFrame(((val,key) for key, values in mydict.items() for val in values),
                  columns=['index','name'])
df['val'] = 1
print(df.pivot(index='index', columns='name', values='val').fillna(0))

产量

name   Silvestri, Simone  Strada, Gino  Zamboni, Clemente  Zeldina, Laura
index                                                                    
100                    0             0                  1               0
101                    0             0                  1               0
102                    0             0                  1               0
103                    0             1                  1               0
104                    0             1                  1               0
105                    0             1                  1               0
106                    0             1                  1               0
107                    0             1                  1               0
108                    0             1                  1               0
109                    0             1                  1               0
110                    0             1                  1               0
111                    0             1                  0               1
112                    0             1                  0               1
113                    1             1                  0               1
114                    0             1                  0               0