Использование словаря в качестве ссылки для вычисления номера нового столбца в фрейме данных pandas из другого фрейма данных

#python #pandas #dictionary

#python #pandas #словарь

Вопрос:

У меня есть, как мне кажется, немного сложная проблема, которую я пытаюсь решить. Вот абстрактная версия. У меня есть список UID и их друзей, хранящихся в словаре:

 In[1]:friend_list
Out[1]:{111:[112, 113, 115],
        112:[111, 114, 115],
        113:[111, 114],
        114:[112, 113, 115],
        115:[111, 112, 114]}

  

У меня также есть два фрейма данных, которые содержат некоторую информацию об этих UID:

df1:

 |   | UID | Sex | Infected |
|:-:|:---:|:---:|:--------:|
| 0 | 111 |  M  |   True   |
| 1 | 112 |  F  |   True   |
| 2 | 113 |  F  |   False  |
| 3 | 114 |  M  |   False  |
| 4 | 115 |  F  |   False  |

  

df2 :

 |   | UID |  Job  | Vaccinated |
|:-:|:---:|:-----:|:----------:|
| 0 | 111 | False |    True    |
| 1 | 112 |  True |    True    |
| 2 | 113 |  True |    False   |
| 3 | 114 |  True |    False   |
| 4 | 115 | False |    False   |

  

Я хотел бы использовать словарь и df2, чтобы выяснить, сколько друзей каждого человека работают и вакцинированы (в виде отдельных столбцов) и преобразовать его в столбец, чтобы результат выглядел следующим образом:

df1:

 |   | UID | Sex | Infected | nFriends_Job | nFriends_Vacc |
|:-:|:---:|:---:|:--------:|:------------:|:-------------:|
| 0 | 111 |  M  |   True   |       2      |       1       |
| 1 | 112 |  F  |   True   |       1      |       1       |
| 2 | 113 |  F  |   False  |       1      |       1       |
| 3 | 114 |  M  |   False  |       2      |       1       |
| 4 | 115 |  F  |   False  |       2      |       2       |

  

Спасибо!

Ответ №1:

Сначала мы, используя цикл for с isin поиском dict , создаем нужное нам значение

 l=[(df2.loc[df2.UID.isin(d[x]),'Job'].sum(),df2.loc[df2.UID.isin(d[x]),'Vaccinated'].sum()) for x in df1.UID]
#here we create the new df to concat
newdf=pd.DataFrame(l,columns=['nFriends_Jobs','nFriends_Vacc '],index=df1.index)
df1=pd.concat([df1,newdf],1)
df1
Out[187]: 
   UID Sex  Infected  nFriends_Jobs  nFriends_Vacc 
0  111   M      True              2               1
1  112   F      True              1               1
2  113   F     False              1               1
3  114   M     False              2               1
4  115   F     False              2               2
  

Комментарии:

1. Это в основном правильно, хотя атрибуты df2 следует называть df2[‘UID’], если я не ошибаюсь. Помечаем это как правильный ответ, поскольку логика работает нормально. Спасибо!