Ejemplo n.º 1
0
        /// <summary>
        /// Convert pandas DataFrame to <see cref="DataTable"/>
        /// </summary>
        /// <param name="pyObject">Pandas DataFrame object</param>
        /// <returns>Result table</returns>
        public static DataTable DataFrameToDataTable(dynamic pyObject)
        {
            if (pyObject == null)
            {
                throw new ArgumentNullException(nameof(pyObject));
            }

            using (var utilities = new PythonUtils())
            {
                if (!utilities.IsDataFrame(pyObject))
                {
                    throw new ArgumentException("Object is not a pandas dataframe", nameof(pyObject));
                }

                //Define columns info
                var columnNames = utilities.GetDataFrameColumnNames(pyObject);
                var columns     = new ColumnInfo[columnNames.Length];

                for (var i = 0; i < columns.Length; i++)
                {
                    var name = columnNames[i];
                    var type = utilities.GetTypeCode(pyObject, i);

                    columns[i] = new ColumnInfo(utilities, name, type);
                }

                //Define result table columns
                var dataTable = new DataTable("Result");
                foreach (var column in columns)
                {
                    var name       = column.Name;
                    var dataColumn = new DataColumn(name)
                    {
                        Caption     = name,
                        DataType    = column.ManagedType,
                        AllowDBNull = true
                    };
                    dataTable.Columns.Add(dataColumn);
                }

                //Iterate for each row
                var rowCount = ((PyObject)pyObject.index).Length();
                for (long i = 0; i < rowCount; i++)
                {
                    var row = dataTable.NewRow();
                    for (var j = 0; j < columns.Length; j++)
                    {
                        var column  = columns[j];
                        var pyValue = utilities.GetDataFrameItem(pyObject, i, j);
                        var value   = pyValue == null ? null : column.GetManagedValue(pyValue);
                        row[j] = value ?? DBNull.Value;
                    }

                    dataTable.Rows.Add(row);
                }

                return(dataTable);
            }
        }