【问题标题】:Filtering rows by a list and sum values按列表和总和值过滤行
【发布时间】:2019-04-01 19:35:50
【问题描述】:

我有一个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 中在ID 列和dist 列中具有此值的所有行。

我在编写通用解决方案时遇到问题,因此我可以处理更大的 df。有什么建议吗?

【问题讨论】:

    标签: python pandas indexing filter


    【解决方案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 函数的错误。

    【讨论】:

    • 谢谢!但我对第一部分有疑问 - 向 df. 添加一个新列。这适用于拥有 List1 和 List2。如果我有更多列表怎么办?
    • 已解决。我只是使用了for 循环。谢谢!
    【解决方案2】:

    嗯,检查一下

    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
    

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多