按列表和求和值过滤行

时间:2018-10-28 20:39:56

标签: python pandas indexing filter

我有一个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]

两个列表都是由其他一些代码生成的。假设在这种情况下List1id=5生成,而List2id=18生成。 我想创建一个新的df

     id      sum_dist
0       5     200.0        
1       18    282.84   

在通过将列sum_dist中的所有值相加而创建新列dist的地方,按List1List2进行过滤。例如,对于id=5,我们查看List1并过滤df中所有具有该值的列IDsum()中具有{{ 1}}列。

我在编写一般解决方案时遇到问题,因此我可以在较大的df上工作。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我首先将id列添加到您的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')

如果您想进一步概括,我首先将列表放入带有ID的字典中​​。这将使上面的代码更容易循环:

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

希望有帮助!

编辑:修复了.loc函数的错误。

答案 1 :(得分:0)

进行检查
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