【问题标题】:Python Keep other columns when using sum() with groupbyPython 在将 sum() 与 groupby 一起使用时保留其他列
【发布时间】:2018-09-21 19:36:56
【问题描述】:

我在下面有一个熊猫数据框:

    df

    name    value1    value2  otherstuff1 otherstuff2 
0   Jack       1         1       1.19        2.39     
1   Jack       1         2       1.19        2.39
2   Luke       0         1       1.08        1.08  
3   Mark       0         1       3.45        3.45
4   Luke       1         0       1.08        1.08

相同的“名称”对于 otherstuff1 和 otherstuff2 将具有相同的值。

我正在尝试按列“名称”和求和列“值1”和求和列“值2”进行分组(不是将 value1 与 value2 求和!!!而是在每列中单独求和)

期望得到以下结果:

    newdf

    name    value1    value2  otherstuff1 otherstuff2 
0   Jack       2         3       1.19        2.39     
1   Luke       1         1       1.08        1.08  
2   Mark       0         1       3.45        3.45

我试过了

newdf = df.groupby(['name'], as_index = False).sum()

哪个按名称分组并正确总结了 value1 和 value2 列,但最终删除了 otherstuff1 和 otherstuff2 列。

请帮忙。非常感谢你们!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    类似的东西?(假设你有相同的 otherstuff1 和 otherstuff2 同名)

    df.groupby(['name','otherstuff1','otherstuff2'],as_index=False).sum()
    Out[121]: 
       name  otherstuff1  otherstuff2  value1  value2
    0  Jack         1.19         2.39       2       3
    1  Luke         1.08         1.08       1       1
    2  Mark         3.45         3.45       0       1
    

    【讨论】:

    • 感谢您的快速响应。但是可能不同的名称对于 otherstuff1 和 otherstuff2 共享相同的值。
    • @SwagZ 仍然是组合(组键)会帮助它,所以你的意思是,同名有多个 otherstuff1 和 otherstuff2?
    • 不确定我是否关注你。您能否更具体并提供更多细节。提前谢谢。
    • otherstuff1 和 otherstuff2 具有相同值的不同名称。例如:Luke 的 value1 为 1.08,value2 为 1.08。有一个新的 Zack,他也有 value1 1.08 和 value2 1.08。
    • @SwagZ then .....名字不一样吧? name + otherstuff1 + otherstuff2 将是唯一的组合,Luke 1.08 1.08。不等于 Zack 1.08 1.08,所以它不属于一个组...我建议查看 groupby 的官方文档。
    【解决方案2】:

    您应该指定 pandas 必须对其他列执行的操作。就您而言,我认为您想保留一行,无论其在组中的位置如何。

    这可以通过群组中的agg 来完成。 agg 接受一个参数,该参数指定应该对每一列执行什么操作。

    df.groupby(['name'], as_index=False).agg({'value1': 'sum', 'value2': 'sum', 'otherstuff1': 'first', 'otherstuff2': 'first'})
    

    【讨论】:

    • 如果我有很多其他的列怎么办?我应该遍历所有其他列并创建字典吗?
    • 您可以先通过删除其他列来计算所需列的总和,然后将生成的数据框与其索引上的旧数据框合并。
    • @Guybrush 但合并不应该工作,因为新旧 df 的长度不同,对吧?你能提供示例代码来说明它是如何工作的吗?
    • @NeStack 它们有不同的长度,但这就是聚合行的目的,不是吗?如果有其他列包含“有用信息”,那么这些信息对于给定组中的所有行都是相同的(在这种情况下,内部连接将完成这项工作)或者它们是不同的(在这种情况下,左连接将完成这项工作)。
    【解决方案3】:

    上面答案中的关键实际上是as_index=False,否则列表中的所有列都会在索引中使用。

    p_summ = p.groupby( attributes_list, as_index=False ).agg( {'AMT':sum })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-17
      • 2021-09-26
      • 2019-07-01
      • 2020-01-29
      • 2020-07-10
      相关资源
      最近更新 更多