Как сгладить объект с вложенным объектом и вложенной коллекцией в фрейм данных Deedle?

#c# #dataframe #deedle

Вопрос:

У меня есть следующие определения классов:

 public class SomeObject {

  public string Id { get; set; }

  public string Name { get; set; }

  public SomeOtherObject SomeOtherObject { get; set; }

  public SomeAnotherObject[] SomeAnotherObjectArr { get; set; }

}

public class SomeOtherObject {

  public string OtherObjectName { get; set; }

  //other properties omitted for brevity 

}

public class SomeAnotherObject {
  
  public string AnotherObjectName { get; set; }

  public bool Flag { get; set; }

}
 

Я читаю файл json, который десериализуется в SomeObject . Цель состоит в том, чтобы создать фрейм данных, который выглядит следующим образом:

 Id   Name   OtherObjectName   AnotherObjectName   Flag
1    Name1  OtherObjectName1  AnotherObjectName1  false
1    Name1  OtherObjectName1  AnotherObjectName2  true
 

Код, который я попробовал, это:

 SomeObject someObject = GetDeserialisedJson();
var df = Frame.FromRecords(new [] { someObject });
df.Print();
 

Вывод, который он выводит, является:

 Id   Name    SomeOtherObject                                  SomeAnotherObjectArr
1    Name1   SomeOtherObject { OtherObjectName = someValue }  Model.SomeAnotherObject[]
 

В принципе, вложенный объект не выравнивается автоматически, и в случае вложенного массива он просто выводит пространство имен.имя класса[]

До того момента, когда объект имеет простую структуру с примитивами, все в порядке. Как достичь требуемой структуры фрейма данных в моем случае? Я абсолютный новичок в этой парадигме, поэтому любые альтернативные подходы или предложения приветствуются.

Ответ №1:

Существует ExpandColumns операция с фреймом данных, которая решает часть вашей проблемы. Операция расширяет все столбцы, содержащие объекты, на несколько столбцов, содержащих свойства этих объектов:

 // Argument indicates how deep this should go
var expanded = df.Expand(1)
 

Это расширится SomeOtherObject SomeOtherObject.OtherObjectName , но это не касается массивов (это не превращает одну строку в несколько строк).

Для массивов я не думаю, что существует какое-либо хорошее встроенное решение (кроме простого просмотра необработанных данных и управления ими). Поэтому я, вероятно, рекомендовал бы использовать какой-нибудь другой инструмент, чтобы сначала преобразовать ваши данные JSON в CSV, а затем загрузить их в Deedle.

Комментарии:

1. Да, перемещение json в CSV — лучший вариант.