GroupBy求和时排除datetime64类型的问题咨询
解决DataFrame Groupby求和时datetime64类型不支持的问题
问题场景
对包含datetime64格式列的DataFrame执行分组求和时,出现如下错误:
dfsum = df.groupby(['City']).sum() TypeError: datetime64 type does not support sum operations
尝试过以下代码,但认为不是最优解:
desired = df.select_dtypes(include=[int, float, object]) dfsum_city = desired.groupby(['City']).sum() dfsum_city.reset_index(inplace=True)
附数据示例:
| Order ID | Product | Quantity Ordered | Price Each | Order Date | Purchase Address | day | month | year | Total Price | City |
|---|---|---|---|---|---|---|---|---|---|---|
| 141234 | iPhone | 1 | 700 | 2019-01-22 21:25:00 | 944 Walnut St, Boston, MA 02215 | 22 | 1 | 2019 | 700 | Boston (MA) |
| 141235 | Lightning Charging Cable | 1 | 14.95 | 2019-01-28 14:15:00 | 185 Maple St, Portland, OR 97035 | 28 | 1 | 2019 | 14.95 | Portland (OR) |
| 141236 | Wired Headphones | 2 | 11.99 | 2019-01-17 13:33:00 | 538 Adams St, San Francisco, CA 94016 | 17 | 1 | 2019 | 23.98 | San Francisco (CA) |
| 141237 | 27in FHD Monitor | 1 | 149.99 | 2019-01-05 20:33:00 | 738 10th St, Los Angeles, CA 90001 | 5 | 1 | 2019 | 149.99 | Los Angeles (CA) |
| 141238 | Wired Headphones | 1 | 11.99 | 2019-01-25 11:59:00 | 387 10th St, Austin, TX 73301 | 25 | 1 | 2019 | 11.99 | Austin (TX) |
优化解决方案
1. 精准指定需要求和的列(推荐)
直接明确指定要聚合的数值列,完全避开datetime和无意义的列:
# 只对需要求和的数值列执行聚合 dfsum_city = df.groupby(['City'])[['Quantity Ordered', 'Total Price']].sum().reset_index()
这种方法最直接,结果只包含你需要的聚合数据,不会处理无关列,避免不必要的错误和无效计算。
2. 排除datetime类型列求和
如果不想手动列举所有数值列,可以排除datetime类型的列,保留其他可求和的数值列:
# 移除datetime类型列,仅保留数值列参与求和 numeric_df = df.select_dtypes(exclude=['datetime64']) dfsum_city = numeric_df.groupby(['City']).sum().reset_index()
和你之前的方法不同,exclude=['datetime64']只会移除时间列,不会把object类型的文本列(如Product、Purchase Address)纳入求和,避免出现文本拼接等无意义的结果。
3. 自定义多列聚合规则(灵活处理)
如果需要同时对不同列执行不同操作(比如对datetime列取最早/最晚订单时间),可以用agg方法自定义聚合逻辑:
dfsum_city = df.groupby(['City']).agg( total_quantity=('Quantity Ordered', 'sum'), total_revenue=('Total Price', 'sum'), earliest_order=('Order Date', 'min'), latest_order=('Order Date', 'max') ).reset_index()
这种方法既能完成数值列的求和,又能对datetime列做有意义的统计,最大化利用数据价值。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

