我认为,我正在尝试解决一个稍微复杂的问题。这是抽象版本。我在字典中存储了一个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 |
谢谢!
答案 0 :(得分:1)
首先,我们在isin
查找中使用for循环,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