Суммирование логического значения для каждого идентификатора, связанного с идентификатором, и присвоение его идентификатору - PullRequest
2 голосов
/ 02 октября 2019

У меня есть фрейм данных с именем составной , который выглядит следующим образом:

| 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  |

Для каждого Person.ID в словаре с именем nn_list у меня естьвсе связанные Person.ID для каждого Person.ID. Это выглядит так:

{ 111:[222,333,444],
222:[111,333],
333:[444],
444:[222,555],
555:[333,666],
666:[222],
}

Я хотел бы иметь возможность просмотреть словарь для всех связанных Person.IDs для данного идентификатора, суммировать логические значения (для каждого столбца) для связанных идентификаторов изатем назначьте это значение в новый столбец (столбцы) для каждой строки. Результат будет выглядеть примерно так:

| 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

Есть ли более разумный способ сделать это такчто это не займет много времени, чтобы бежать? Спасибо!

Ответы [ 3 ]

1 голос
/ 02 октября 2019

Мы можем сделать explode, затем merge: уведомление о разнесении доступно после 0,25 в pandas

s=pd.Series(d).explode().to_frame('Person.ID').reset_index()
s=s.merge(df).groupby('index')[['V.F','V.nF']].sum()
Newdf=pd.concat([df.set_index('Person.ID'),s.add_prefix('n_')],axis=1).reset_index()
Newdf
   index  ID    V.F   V.nF  n_V.F  n_V.nF
0    111   1   True   True    2.0     1.0
1    222   2  False   True    2.0     1.0
2    333   3   True  False    1.0     0.0
3    444   4   True  False    1.0     2.0
4    555   5   True   True    1.0     1.0
5    666   6  False   True    0.0     1.0

d={ 111:[222,333,444],
222:[111,333],
333:[444],
444:[222,555],
555:[333,666],
666:[222],
}
0 голосов
/ 02 октября 2019

Назначьте ваш диктант на d. Вы можете использовать .loc и sum непосредственно для значений d, используя диктовку. После этого создайте фрейм данных из результата dict и присоединитесь к df

df1 = df.set_index('Person.ID')
n = {k: df1.loc[v, ['V.F', 'V.nF']].values.sum(0) for k, v in d.items()}

Out[889]:
{111: array([2, 1]),
 222: array([2, 1]),
 333: array([1, 0]),
 444: array([1, 2]),
 555: array([1, 1]),
 666: array([0, 1])}

df2 = pd.DataFrame.from_dict(n, orient='index', columns=['n_V.F', 'n_V.nF'])
df1.join(df2).reset_index()

Out[898]:
   Person.ID  ID    V.F   V.nF  n_V.F  n_V.nF
0        111   1   True   True      2       1
1        222   2  False   True      2       1
2        333   3   True  False      1       0
3        444   4   True  False      1       2
4        555   5   True   True      1       1
5        666   6  False   True      0       1
0 голосов
/ 02 октября 2019

Другой подход с map:

composite.set_index('Person.ID', inplace=True)

s = pd.concat(pd.Series(y, index=[x]*len(y)) for x,y in d.items())

composite['n_V.F'] = s.map(u['V.F']).groupby(level=0).sum()
composite['n_V.nF'] = s.map(u['V.nF']).groupby(level=0).sum()

Вывод:

           ID    V.F   V.nF  n_V.F  n_V.nF
Person.ID                                 
111         1   True   True    2.0     1.0
222         2  False   True    2.0     1.0
333         3   True  False    1.0     0.0
444         4   True  False    1.0     2.0
555         5   True   True    1.0     1.0
666         6  False   True    0.0     1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...