(self, ordered_dims: Mapping[Any, int])
| 7239 | ) |
| 7240 | |
| 7241 | def _to_dataframe(self, ordered_dims: Mapping[Any, int]): |
| 7242 | from xarray.core.extension_array import PandasExtensionArray |
| 7243 | |
| 7244 | # All and only non-index arrays (whether data or coordinates) should |
| 7245 | # become columns in the output DataFrame. Excluding indexes rather |
| 7246 | # than dims handles the case of a MultiIndex along a single dimension. |
| 7247 | columns_in_order = [k for k in self.variables if k not in self.xindexes] |
| 7248 | non_extension_array_columns = [ |
| 7249 | k |
| 7250 | for k in columns_in_order |
| 7251 | if not pd.api.types.is_extension_array_dtype(self.variables[k].data) # noqa: TID251 |
| 7252 | ] |
| 7253 | extension_array_columns = [ |
| 7254 | k |
| 7255 | for k in columns_in_order |
| 7256 | if pd.api.types.is_extension_array_dtype(self.variables[k].data) # noqa: TID251 |
| 7257 | ] |
| 7258 | extension_array_columns_different_index = [ |
| 7259 | k |
| 7260 | for k in extension_array_columns |
| 7261 | if set(self.variables[k].dims) != set(ordered_dims.keys()) |
| 7262 | ] |
| 7263 | extension_array_columns_same_index = [ |
| 7264 | k |
| 7265 | for k in extension_array_columns |
| 7266 | if k not in extension_array_columns_different_index |
| 7267 | ] |
| 7268 | data = [ |
| 7269 | self._variables[k].set_dims(ordered_dims).values.reshape(-1) |
| 7270 | for k in non_extension_array_columns |
| 7271 | ] |
| 7272 | index = self.coords.to_index([*ordered_dims]) |
| 7273 | broadcasted_df = pd.DataFrame( |
| 7274 | { |
| 7275 | **dict(zip(non_extension_array_columns, data, strict=True)), |
| 7276 | **{ |
| 7277 | c: self.variables[c].data |
| 7278 | for c in extension_array_columns_same_index |
| 7279 | }, |
| 7280 | }, |
| 7281 | index=index, |
| 7282 | ) |
| 7283 | for extension_array_column in extension_array_columns_different_index: |
| 7284 | extension_array = self.variables[extension_array_column].data |
| 7285 | index = self[ |
| 7286 | self.variables[extension_array_column].dims[0] |
| 7287 | ].coords.to_index() |
| 7288 | extension_array_df = pd.DataFrame( |
| 7289 | {extension_array_column: extension_array}, |
| 7290 | index=pd.Index(index.array) |
| 7291 | if isinstance(index, PandasExtensionArray) # type: ignore[redundant-expr] |
| 7292 | else index, |
| 7293 | ) |
| 7294 | extension_array_df.index.name = self.variables[extension_array_column].dims[ |
| 7295 | 0 |
| 7296 | ] |
| 7297 | broadcasted_df = broadcasted_df.join(extension_array_df) |
| 7298 | return broadcasted_df[columns_in_order] |
no test coverage detected