博客
关于我
Pandas中的GROUP BY AND SUM不丢失列
阅读量:793 次
发布时间:2023-02-26

本文共 1143 字,大约阅读时间需要 3 分钟。

在学习Pandas时,很多人会遇到GROUP BY和SUM操作后丢失列的问题。让我详细解释一下这个问题,并提供解决方法。

首先,当我们使用groupby()函数进行分组后,使用sum()函数进行求和操作时,Pandas默认会将结果中的列名设置为被分组的列名,而不是保留原始的所有列。这样做的原因是为了简化结果,通常只保留需要的聚合列。

例如,以下代码:

import pandas as pd
df = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)
})
result = df.groupby('A').sum()
print(result)

运行后结果为:

C      D
A bar -0.045608 -0.038593
foo 1.096079 0.530872

可以看到,列'B'的数据没有被保留。这是因为sum()默认只会对数值列求和,并以分组列名为结果的列名。

解决方法

要保留所有原始列,可以使用agg()函数,它允许指定需要保留的列:

result = df.groupby('A').agg({'C': 'sum', 'D': 'sum'})

运行后结果保留所有列:

C      D
A bar -0.045608 -0.038593
foo 1.096079 0.530872

复杂操作

如果需要对每一组数据进行复杂操作,可以使用apply()函数:

result = df.groupby('A').apply(lambda x: x['C'].mean())

运行后结果为:

A
bar -0.045608
foo 1.096079
Name: C, dtype: float64

在这种情况下,结果的结构可能与原始DataFrame不同,但可以通过reset_index()恢复原始结构:

result = df.groupby('A').apply(lambda x: x['C'].mean()).reset_index()

总结

  • 使用agg()可以同时保留和聚合多列。
  • 使用apply()可以对每一组数据执行自定义函数。
  • 使用reset_index()可以恢复聚合后的DataFrame结构。

通过合理使用这些函数,可以控制结果中的列,避免丢失数据。

转载地址:http://xpvfk.baihongyu.com/

你可能感兴趣的文章
oracle表空间查询维护命令大全之三(暂时表空间)史上最全
查看>>
oracle表访问方式
查看>>
Oracle触发器
查看>>
Oracle计划将ZGC项目提交给OpenJDK
查看>>
oracle账号共享
查看>>
Oracle闪回技术(Flashback)
查看>>
oracle零碎要点---ip地址问题,服务问题,系统默认密码问题
查看>>
oracle零碎要点---oracle em的web访问地址忘了
查看>>
Oracle零碎要点---多表联合查询,收集数据库基本资料
查看>>
Oracle静默安装
查看>>
【Bert101】变压器模型背后的复杂数学【02/4】
查看>>
Oracle面试题:Oracle中truncate和delete的区别
查看>>
ThreadLocal线程内部存储类
查看>>
thinkphp 常用SQL执行语句总结
查看>>
Oracle:ORA-00911: 无效字符
查看>>
Text-to-Image with Diffusion models的巅峰之作:深入解读 DALL·E 2
查看>>
Tensorflow.python.framework.errors_impl.ResourceExhaustedError:无法分配内存[操作:AddV2]
查看>>
TCP基本入门-简单认识一下什么是TCP
查看>>
tableviewcell 中使用autolayout自适应高度
查看>>
Symbolic Aggregate approXimation(SAX,符号聚合近似)介绍-ChatGPT4o作答
查看>>