我有一个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
()中具有{{ 1}}列。
我在编写一般解决方案时遇到问题,因此我可以在较大的df上工作。有什么建议吗?
答案 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