以字典值为条件的假人

2024-06-16 10:31:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有很多名字的数据框

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

任何暗示都将不胜感激!你知道吗


Tags: namein名称df字典mydictmylistsimone
2条回答

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

相关问题 更多 >