Python 以字典值为条件的假人

Python 以字典值为条件的假人,python,dictionary,pandas,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,

我有一个数据框,里面有很多名字

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”,除“113”外,所有的伪变量都应取值为0

以下是我的最新尝试:

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

任何提示都将不胜感激

您可以使用
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

我认为unutbu的回答相当优雅,但似乎没有认识到“斯特拉达,吉诺”,“塞尔迪娜,劳拉”,“西尔维斯特里,西蒙尼”都有同样的回答。你可以这样修理它

对于你的问题,关键点是你的
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

dictionary={key:{num:int(num in mydict[key])for num in mylist}for key in mykeys}
我现在只能测试这个,它确实解决了我的问题(我只需要在最后转置数据帧)。谢谢!