You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在xarray Dataset中按shipID分组统计唯一品类数量

用Xarray统计每个货运单的唯一品类数量

问题背景

现有一个名为shipDS的xarray货运项目数据集:

<xarray.Dataset>
Dimensions:   (lineItem: 10)
Dimensions without coordinates: lineItem
Data variables:
    shipID    (lineItem) int64 1 1 2 3 4 4 5 5 5 5
    prodID    (lineItem) int64 90 92 92 90 90 91 92 93 94 95
    category  (lineItem) <U1 'A' 'B' 'B' 'A' 'A' 'A' 'B' 'C' 'D' 'D'

需求:统计每个货运单(即每个shipID)包含的唯一品类数量。

创建数据集代码

import xarray as xr

# 构建货运数据集
# 每个货运单可能包含多个产品
shipIDs = [1,1,2,3,4,4,5,5,5,5]
productIDs = [90,92,92,90,90,91,92,93,94,95]
category = ["A","B","B","A","A","A","B","C","D","D"]

shipDS = xr.Dataset(data_vars = 
    {
        "shipID": ("lineItem", shipIDs),
        "prodID": ("lineItem", productIDs),
        "category": ("lineItem", category)
     }
)

已掌握的Pandas实现方式

# pandas实现代码
(
    shipDS
    .to_pandas()
    .groupby(["shipID","category"])
    .count()
    .reset_index()
    .groupby("shipID")
    .agg(numUniqCategories=('category', 'count'))
)

运行后得到结果:

numUniqCategories
shipID  
1   2
2   1
3   1
4   1
5   3

Xarray专属实现方案

方法一:分组后直接统计唯一值数量

利用groupby按shipID分组,对category变量调用nunique()方法指定维度即可完成统计:

# Xarray实现代码
result = shipDS.groupby("shipID")["category"].nunique(dim="lineItem").to_dataset(name="numUniqCategories")

输出结果:

<xarray.Dataset>
Dimensions:           (shipID: 5)
Coordinates:
  * shipID            (shipID) int64 1 2 3 4 5
Data variables:
    numUniqCategories  (shipID) int64 2 1 1 1 3

如果需要转换为Pandas DataFrame格式,执行:

result.to_dataframe()

方法二:先去重再分组计数

先通过分组保留每个shipID与category的唯一组合,再按shipID统计组合数量:

# 保留shipID和category的唯一组合
unique_cat_per_ship = shipDS.groupby(["shipID", "category"]).first()
# 按shipID分组统计品类数量
result = unique_cat_per_ship.groupby("shipID").count(dim="category").rename({"prodID": "numUniqCategories"})

此方法同样能得到与Pandas一致的统计结果。

内容的提问来源于stack exchange,提问作者Adam Fleischhacker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:45:47