33// See the LICENSE file in the project root for more information.
44
55using System ;
6+ using System . Collections . Generic ;
67using System . Linq ;
78using Microsoft . Data . Analysis ;
89
@@ -22,19 +23,32 @@ public static DataFrame ToDataFrame(this TabularDataResource tabularDataResource
2223
2324 foreach ( var fieldDescriptor in tabularDataResource . Schema . Fields )
2425 {
26+ var fieldName = fieldDescriptor . Name ;
27+ var column = tabularDataResource . Data . Select ( row =>
28+ {
29+ if ( row is IDictionary < string , object > dictionary )
30+ {
31+ return dictionary [ fieldName ] ;
32+ }
33+ else
34+ {
35+ return row . FirstOrDefault ( kvp => kvp . Key == fieldName ) . Value ;
36+ }
37+ } ) ;
38+
2539 switch ( fieldDescriptor . Type )
2640 {
2741 case TableSchemaFieldType . Number :
28- dataFrame . Columns . Add ( new DoubleDataFrameColumn ( fieldDescriptor . Name , tabularDataResource . Data . Select ( d => Convert . ToDouble ( d [ fieldDescriptor . Name ] ) ) ) ) ;
42+ dataFrame . Columns . Add ( new DoubleDataFrameColumn ( fieldDescriptor . Name , column . Select ( Convert . ToDouble ) ) ) ;
2943 break ;
3044 case TableSchemaFieldType . Integer :
31- dataFrame . Columns . Add ( new Int64DataFrameColumn ( fieldDescriptor . Name , tabularDataResource . Data . Select ( d => Convert . ToInt64 ( d [ fieldDescriptor . Name ] ) ) ) ) ;
45+ dataFrame . Columns . Add ( new Int64DataFrameColumn ( fieldDescriptor . Name , column . Select ( Convert . ToInt64 ) ) ) ;
3246 break ;
3347 case TableSchemaFieldType . Boolean :
34- dataFrame . Columns . Add ( new BooleanDataFrameColumn ( fieldDescriptor . Name , tabularDataResource . Data . Select ( d => Convert . ToBoolean ( d [ fieldDescriptor . Name ] ) ) ) ) ;
48+ dataFrame . Columns . Add ( new BooleanDataFrameColumn ( fieldDescriptor . Name , column . Select ( Convert . ToBoolean ) ) ) ;
3549 break ;
3650 case TableSchemaFieldType . String :
37- dataFrame . Columns . Add ( new StringDataFrameColumn ( fieldDescriptor . Name , tabularDataResource . Data . Select ( d => Convert . ToString ( d [ fieldDescriptor . Name ] ) ) ) ) ;
51+ dataFrame . Columns . Add ( new StringDataFrameColumn ( fieldDescriptor . Name , column . Select ( Convert . ToString ) ) ) ;
3852 break ;
3953 default :
4054 throw new ArgumentOutOfRangeException ( ) ;
0 commit comments