我有一个名为复合的数据框,看起来像这样:
| ID | Person.ID | V.F | V.nF |
|----|-----------|-------|-------|
| 1 | 111 | True | True |
| 2 | 222 | False | True |
| 3 | 333 | True | False |
| 4 | 444 | True | False |
| 5 | 555 | True | True |
| 6 | 666 | False | True |
对于每个个人ID,在一个名为nn\u list的字典中,我有所有相关的个人ID对于每个个人ID。这看起来像:
{ 111:[222,333,444],
222:[111,333],
333:[444],
444:[222,555],
555:[333,666],
666:[222],
}
我想看看字典里所有相关的单词个人ID对于给定的ID,将相关ID的布尔值(每列)相加,然后在每行的新列中指定该值。结果如下所示:
| ID | Person.ID | V.F | V.nF | n_V.F | n_V.nF |
|----|-----------|-------|-------|-------|--------|
| 1 | 111 | True | True | 2 | 1 |
| 2 | 222 | False | True | 2 | 1 |
| 3 | 333 | True | False | 1 | 0 |
| 4 | 444 | True | False | 1 | 2 |
| 5 | 555 | True | True | 1 | 1 |
| 6 | 666 | False | True | 0 | 1 |
我目前能够以一种非常缓慢和低效的方式完成这项工作:
l=[composite.loc[composite['Person.ID'].isin(nn_list[x]),'V.F'].sum() for x in composite['Person.ID']]
composite['n_V.F']=l
l=[composite.loc[composite['Person.ID'].isin(nn_list[x]),'V.nF'].sum() for x in composite['Person.ID']]
composite['n_V.nF']=l
有没有一个更聪明的方法来做到这一点,使它不需要很长时间运行?谢谢!你知道吗
将您的dict分配给
d
。您可以使用dict理解直接对d
的值使用.loc
和sum
。之后,从结果dict构造dataframe并连接回df
我们可以做
explode
然后merge
:注意,explode在pandas
的0.25之后可用另一种方法是
map
:输出:
相关问题 更多 >
编程相关推荐