#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’], если я не ошибаюсь. Помечаем это как правильный ответ, поскольку логика работает нормально. Спасибо!