Можно ли добавить в xarray.Dataset?

Я использовал метод .append() для объединения двух таблиц (с одинаковыми полями) в пандах. К сожалению, этого метода нет в xarray, есть ли другой способ сделать это?


person Itay Lieder    schedule 30.10.2015    source источник


Ответы (2)


Xarray не имеет метода добавления, потому что его структуры данных построены на основе неизменяемых массивов NumPy, поэтому мы не можем добавлять новые элементы, не копируя весь массив. Следовательно, мы не реализуем метод append. Вместо этого вы должны использовать xarray.concat.

Один из обычных шаблонов - накапливать объекты Dataset / DataArray в списке и объединять их один раз в конце:

datasets = []
for example in examples:
    ds = create_an_xarray_dataset(example)
    datasets.append(ds)
combined = xarray.concat(datasets, dim='example')

Вы не хотите объединяться внутри цикла - это заставит ваш код работать за квадратичное время.

В качестве альтернативы вы можете выделить один набор данных / DataArray для результата и введите значения с индексацией, например,

dims = ('example', 'x', 'y')
combined = xarray.Dataset(
    data_vars={'my_variable': (dims, np.zeros((len(examples), 100, 200)))},
    coords={'example': examples})
for example in examples:
    combined.loc[dict(example=example)] = create_an_xarray_dataset(example)

(Обратите внимание, что вам всегда нужно использовать индексацию с квадратными скобками, например [] или .loc[] - назначение с помощью sel() и isel() не работает.)

Эти два подхода одинаково эффективны - на самом деле вопрос вкуса, какой из них лучше подходит вам или лучше подходит для вашего приложения.

Как бы то ни было, у pandas есть то же ограничение: метод append действительно копирует целые фреймы данных каждый раз, когда он используется. Это постоянный сюрприз и источник проблем с производительностью для новых пользователей. Так что я считаю, что мы приняли правильное дизайнерское решение, не включив его в xarray.

person shoyer    schedule 12.11.2015

Вы можете использовать .concat или merge(). Документация.

person bkaf    schedule 30.10.2015