2015-06-24 2 views
0

У меня есть dataframe с кучей именМанекены обусловливающие словаря значений

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, Whi ch равно единице, если элемент находится в значении словаря, связанного с именем: поэтому для «Сильвестри, Симона» все манекены должны принимать значение 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

'Словарь = {ключ: {номер: INT (число в mydict [ключ]) для NUM в MyList} для ключа в MyKeys}' – Delgan

ответ

2

Я думаю unutbu в ответ довольно элегантно, но, кажется, не в состоянии признать 113 разделяет 'Strada, Джино', «Zeldina, Лора, Сильвестри, Симона. Вы можете это исправить.

Для вашего вопроса ключевым моментом является то, что ваш 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 
+0

я только был в состоянии проверить это сейчас, и это решает мой проблема (мне просто нужно транспонировать кадр данных в конце). Большое спасибо! – simone

+0

Добро пожаловать. Рад, что я мог бы помочь. –

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 
Смежные вопросы