Me gustaría ordenar las coordenadas y variables de un conjunto de Dataset xarray en orden alfabético. He intentado hacer esto usando ds.transpose(*sorted(ds.dims)) . Esto parece ordenar las coordenadas/dimensiones de cada DataArray en el Dataset , pero no las coordenadas del Dataset en sí.
Ejemplo:
>>> ds = xr.Dataset( ... { ... 'z': (['c', 'a', 'b'], np.ones(shape=(2, 2, 2))), ... 'x': (['a', 'b', 'c'], np.zeros(shape=(2, 2, 2))), ... 'y': (['c'], [0, 1]), ... }, ... coords={'c': [30, 31], 'a': [10, 11], 'b': [20, 21]} ... ) >>> ds.transpose('a', 'b', 'c') <xarray.Dataset> Dimensions: (c: 2, a: 2, b: 2) Coordinates: * c (c) int64 30 31 * a (a) int64 10 11 * b (b) int64 20 21 Data variables: z (a, b, c) float64 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 x (a, b, c) float64 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 y (c) int64 0 1 El comportamiento esperado es que las coordenadas y dimensiones de todo el xr.Dataset se ordenen como 'a', 'b', 'c' . Sin embargo, puede ver que solo las dimensiones de las variables de datos están en este orden.
¿Cómo puedo ordenar las coordenadas y las variables de un conjunto de datos, no solo las dimensiones de la matriz?
Cualquier ayuda es muy apreciada, ¡gracias!
Revisa estos:
ds = xr.Dataset( data_vars={ 'z': (['c', 'a', 'b'], np.ones(shape=(2, 2, 2))), 'x': (['a', 'b', 'c'], np.zeros(shape=(2, 2, 2))), 'y': (['c'], [0, 1]), }, coords={'c': [30, 31], 'a': [10, 11], 'b': [20, 21]} ) df = ds.to_dataframe() df = df.reindex(sorted(df.columns), axis=1) print(df.to_xarray()) # <xarray.Dataset> # Dimensions: (a: 2, b: 2, c: 2) # Coordinates: # * a (a) int64 10 11 # * b (b) int64 20 21 # * c (c) int64 30 31 # Data variables: # x (a, b, c) float64 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 # y (a, b, c) int32 0 1 0 1 0 1 0 1 # z (a, b, c) float64 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0Puede hacer esto en xarray con xr.Dataset.reindex_like y xr.Dataset.reindex . El primero es útil si tiene otro objeto con el que desea hacer coincidir.
ds = xr.Dataset( data_vars={ 'z': (['c', 'a', 'b'], np.ones(shape=(2, 2, 2))), 'x': (['a', 'b', 'c'], np.zeros(shape=(2, 2, 2))), 'y': (['c'], [0, 1]), }, coords={'c': [30, 31], 'a': [10, 11], 'b': [20, 21]} ) current_indexes = ds.indexes desired_order = ['a', 'b', 'c'] reordered_indexes = {index_name: current_indexes[index_name] for index_name in desired_order} reordered_ds = ds.reindex(reordered_indexes) >>> ds <xarray.Dataset> Dimensions: (c: 2, a: 2, b: 2) Coordinates: * c (c) int64 30 31 * a (a) int64 10 11 * b (b) int64 20 21 Data variables: z (c, a, b) float64 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 x (a, b, c) float64 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 y (c) int64 0 1 >>> reordered_ds <xarray.Dataset> Dimensions: (a: 2, b: 2, c: 2) Coordinates: * a (a) int64 10 11 * b (b) int64 20 21 * c (c) int64 30 31 Data variables: z (c, a, b) float64 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 x (a, b, c) float64 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 y (c) int64 0 1