Фильтрация строк по списку и сумме значений - PullRequest
0 голосов
/ 28 октября 2018

У меня есть df

    ID       Count_     Sum       AA     BB        dist
0       3     0.0        50.0   300.0    0.0  100.000000
1       7     0.0        40.0   700.0    0.0  141.421356
2    4983     0.0         0.0   500.0  200.0    0.000000
3    4982     0.0         0.0   400.0  200.0    0.000000
4    4984     0.0        30.0   600.0  200.0  100.000000
5    4981     0.0         0.0   300.0  200.0    0.000000
6    4985     0.0        40.0   700.0  200.0  141.421356

И два списка

List1 = [3,4983,4984]
List2 = [7,4981,4985]

Оба списка генерируются другим кодом.И скажем, в этом случае List1 генерируется id=5, а List2 генерируется id=18.Я хотел бы создать новый df, такой как

     id      sum_dist
0       5     200.0        
1       18    282.84   

Где новый столбец sum_dist создается суммой всех значений в столбце dist, фильтруя по List1 или List2.Например - для id=5 мы смотрим на List1 и фильтруем все строки в df, которые имеют эти значения в столбце ID и sum () в столбце dist.

IУ меня проблемы с написанием общего решения, поэтому я смогу работать с большими df.Есть предложения?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Уммм проверить с

from collections import ChainMap
mapdict = dict(ChainMap(*map(dict.fromkeys, [[3,4983,4984],[7,4981,4985]],[5,18])))


df.dist.groupby(df.ID.map(mapdict)).sum()
Out[8]: 
ID
5.0     200.000000
18.0    282.842712
Name: dist, dtype: float64
0 голосов
/ 28 октября 2018

Я бы сначала вставил этот столбец идентификаторов в ваш df. Что-то вроде:

df['id'] = None
df.loc[df['ID'].isin(List1),'id'] = 5
df.loc[df['ID'].isin(List2),'id'] = 18

Тогда вы можете сделать последний шаг с .groupby

df.groupby(by = 'id')['dist'].agg('sum')

Если вы хотите обобщить дальше, я бы начал с помещения списков в словарь с идентификаторами. Это упростит приведенный выше код в цикле:

lists = {5: [3,4983,4984],
         18: [7,4981,4985]}

Надеюсь, это поможет!

EDIT: исправлена ​​ошибка с функцией .loc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...