Xarray:按连续的相同值分组

Xarray: grouping by contiguous identical values

在Pandas中,将[1,1,1,1,2,2,1,1,1,1]等系列(/数组)分割成return组[1,1,1,1][2,2,][1,1,1,1]。为此,我使用语法:

 datagroups= df[key].groupby(df[key][df[key][variable] == some condition].index.to_series().diff().ne(1).cumsum())

...我将通过 df[key][variable] == some condition 获取各个组。具有不连续的某些条件的相同值的组是它们自己的组。如果条件是 x < 2,我最终会得到上面示例中的 [1,1,1,1][1,1,1,1]

我正在尝试在 xarray 包中做同样的事情,因为我正在处理多维数据,但上面的语法显然不起作用。

到目前为止我取得的成功:

a) 应用一些条件来用 NaN 分隔我想要的值:

 datagroups_notsplit = df[key].where(df[key][variable] == some condition)

所以现在我有了上面示例中的组 [1,1,1,1,Nan,Nan,1,1,1,1](如果某些条件是 x <2)。问题是,如何切割这些组,使其变成 [1,1,1,1],[1,1,1,1]?

b) 或者,按某些条件分组...

 datagroups_agglomerated = df[key].groupby_bins('variable', bins = [cleverly designed for some condition])

但是,按照上面的示例,我最终得到了组 [1,1,1,1,1,1,1][2,2]。有没有办法对非连续索引值的组进行分组?

在不了解您的 'some condition' 可以是什么,或者您的数据域(仅限小整数?)的情况下,我只是解决缺少的 pandas 功能,例如:

import pandas as pd
import xarray as xr

dat = xr.DataArray([1,1,1,1,2,2,1,1,1,1], dims='x')

# Use `diff()` to get groups of contiguous values
(dat.diff('x') != 0)]

# ...prepend a leading 0 (pedantic syntax for xarray)
xr.concat([xr.DataArray(0), (dat.diff('x') != 0)], 'x')

# ...take cumsum() to get group indices
xr.concat([xr.DataArray(0), (dat.diff('x') != 0)], 'x').cumsum()
# array([0, 0, 0, 0, 1, 1, 2, 2, 2, 2])

dat.groupby(xr.concat([xr.DataArray(0), (dat.diff('x') != 0)], 'x').cumsum() )
# DataArrayGroupBy, grouped over 'group'
# 3 groups with labels 0, 1, 2.

xarray How do I 页面可以使用一些像这样的方法(“分组连续值”),建议您联系他们并添加它们。

我的用例比我发布的最小示例要复杂一些,因为使用了时间序列索引并且希望对某些条件进行子选择;但是,我能够通过以下方式调整上面 smci 的答案:

(1) 创建索引号变量:

df = Dataset( data_vars={ 'some_data' : (('date'), some_data), 'more_data' : (('date'), more_data), 'indexnumber' : (('date'), arange(0,len(date_arr)) }, coords={ 'date' : date_arr } )

(2) 获取 groupby 组的索引:

ind_slice = df.where(df['more_data'] == some_condition)['indexnumber'].dropna(dim='date').diff(dim='date') !=1).cumsum().indexes

(3) 获取 cumsum 字段:

sumcum = df.where(df['more_data'] == some_condition)['indexnumber'].dropna(dim='date').diff(dim='date') !=1).cumsum()

(4) 重构一个新的df:

df2 = df.loc[ind_slice]

(5) 添加cumsum字段:

df2['sumcum'] = sumcum

(6) 分组依据:

groups = df2.groupby(df['sumcum'])

希望这能帮助其他想要这样做的人。