本文共 1143 字,大约阅读时间需要 3 分钟。
在学习Pandas时,很多人会遇到GROUP BY和SUM操作后丢失列的问题。让我详细解释一下这个问题,并提供解决方法。
首先,当我们使用groupby()函数进行分组后,使用sum()函数进行求和操作时,Pandas默认会将结果中的列名设置为被分组的列名,而不是保留原始的所有列。这样做的原因是为了简化结果,通常只保留需要的聚合列。
例如,以下代码:
import pandas as pddf = 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 DA bar -0.045608 -0.038593 foo 1.096079 0.530872
可以看到,列'B'的数据没有被保留。这是因为sum()默认只会对数值列求和,并以分组列名为结果的列名。
要保留所有原始列,可以使用agg()函数,它允许指定需要保留的列:
result = df.groupby('A').agg({'C': 'sum', 'D': 'sum'}) 运行后结果保留所有列:
C DA bar -0.045608 -0.038593 foo 1.096079 0.530872
如果需要对每一组数据进行复杂操作,可以使用apply()函数:
result = df.groupby('A').apply(lambda x: x['C'].mean()) 运行后结果为:
Abar -0.045608 foo 1.096079Name: C, dtype: float64
在这种情况下,结果的结构可能与原始DataFrame不同,但可以通过reset_index()恢复原始结构:
result = df.groupby('A').apply(lambda x: x['C'].mean()).reset_index() 通过合理使用这些函数,可以控制结果中的列,避免丢失数据。
转载地址:http://xpvfk.baihongyu.com/