Добавление чисел из двух фреймов данных в Deedle с использованием мультиключевого индекса

1

Я новичок в Deedle. Я искал всюду, ища примеры, которые могут помочь мне выполнить следующую задачу:

  1. Индексный фрейм данных с использованием нескольких столбцов (3 в примере - дата, идентификатор и название)
  2. Добавление числовых столбцов в нескольких кадрах данных вместе (столбец продаж в примере)
  3. Группировка и добавление продаж произошли в тот же день

Мой нынешний подход приведен ниже. Прежде всего - это не работает из-за недостающих значений, и я не знаю, как легко их обрабатывать при добавлении фреймов данных. Второй - интересно, есть ли более элегантный способ сделать это.

// Remove unused columns
var df = dfRaw.Columns[new[] { "Date", "ID", "Title", "Sales" }];

// Index data frame using 3 columns 
var dfIndexed = df.IndexRowsUsing(r => Tuple.Create(r.GetAs<DateTime>("Date"), r.GetAs<string>("ID"), r.GetAs<string>("Title")) );

// Remove indexed columns
dfIndexed.DropColumn("Date");
dfIndexed.DropColumn("ID"); 
dfIndexed.DropColumn("Title"); 

// Add data frames. Does not work as it will add only
// keys existing in both data frames
dfTotal += dfIndexed

Таблица 1

Date,ID,Title,Sales,Market
2014-03-01,ID1,Title1,1,US
2014-03-01,ID1,Title1,2,CA
2014-03-03,ID2,Title2,3,CA

Таблица 2

Date,ID,Title,Sales,Market
2014-03-02,ID1,Title1,2,US
2014-03-03,ID2,Title2,2,CA

Ожидаемые результаты

Date,ID,Title,Sales
2014-03-01,ID1,Title1,3
2014-03-02,ID1,Title1,2
2014-03-03,ID2,Title2,5
Теги:
csv
deedle

1 ответ

0

Я думаю, что ваш подход с использованием кортежей имеет смысл.

Немного досадно, что нет простого способа указывать значения по умолчанию при добавлении! Самое легкое решение, о котором я могу думать, состоит в том, чтобы перестроить обе серии в один и тот же набор ключей и использовать операцию заполнения для предоставления значений по умолчанию. Используя простые серии в качестве примера, что-то вроде этого должно сделать трюк:

var allKeys = seris1.Keys.Union(series2.Keys);
var aligned1 = series1.Realign(allKeys).FillMissing(0.0);
var aligned2 = series2.Realign(allKeys).FillMissing(0.0);
var res = aligned1 + aligned2;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню