如何使用 xarray 计算组的大小?
How to count size of groups using 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
对象?有没有理由不引入类似于Pandas的DataArrayGroupBy.size()
方法?
(我写这道题的时候用的是xarray version 0.15.0。)
这里的答案是使用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
我想在使用 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
对象?有没有理由不引入类似于Pandas的DataArrayGroupBy.size()
方法?
(我写这道题的时候用的是xarray version 0.15.0。)
这里的答案是使用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