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'])
希望这能帮助其他想要这样做的人。
在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'])
希望这能帮助其他想要这样做的人。