首页 > 解决方案 > 如何使用 xarray 计算组的大小?

问题描述

我想使用 分组后计算组的大小groupby(),即某个值的出现次数。使用 pandas 可以使用GroupBy.size()

>>> pd.DataFrame({'my_column': [1, 1, 1, 2, 2, 3]}).groupby(by='my_column').size()                                                  
my_column
1    3
2    2
3    1
dtype: int64

Numpy 支持类似的使用np.unique()

>>> np.unique([1, 1, 1, 2, 2, 3], return_counts=True)[1]                                                                            
array([3, 2, 1])

使用 xarray 我只能找到非常尴尬的方法来实现相同的目标,例如将 DataArray 对象转换为 Pandas DataFrame:

>>> d = xr.DataArray([1, 1, 1, 2, 2, 3], name='my_column')
>>> d.to_dataframe().groupby(by='my_column').size()                                                                         
my_column
1    3
2    2
3    1
dtype: int64

...或者做一些非常难以理解的事情,比如:

>>> xr.ones_like(d).groupby(d).sum(dim='dim_0')                                                                                    
<xarray.DataArray 'my_column' (my_column: 3)>
array([3, 2, 1])
Coordinates:
  * my_column  (my_column) int64 1 2 3

有没有更好的方法来获得DataArray具有正确坐标和尺寸的缩小对象?有没有理由不引入DataArrayGroupBy.size()类似于 Pandas 的方法?

(我在写这个问题时使用的是 xarray 版本 0.15.0。)

标签: pythonpandaspython-xarray

解决方案


这里的答案是使用GroupBy.count()

>>> d = xr.DataArray([1, 1, 1, 2, 2, 3], name='my_column')                                                                          
>>> d.groupby(d).count()                                                                                                            
<xarray.DataArray 'my_column' (my_column: 3)>
array([3, 2, 1])
Coordinates:
  * my_column  (my_column) int64 1 2 3

推荐阅读