我有一个带有一堆名字的数据框
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
任何提示都会非常感激!
答案 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