dotnet/machinelearning · error · ArgumentException

Strings.BadColumnCast (formatted with column.DataType, typeo

Error message

Strings.BadColumnCast (formatted with column.DataType, typeof(Int16))

What it means

DataFrameColumnCollection.GetInt16Column(name) only returns a column when it is exactly an Int16DataFrameColumn. When a column exists under that name but has a different data type, the library throws ArgumentException with Strings.BadColumnCast, formatted with the actual column DataType and typeof(Int16). It signals a type mismatch between the requested accessor and the stored column, not a missing column.

Source

Thrown at src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs:444

            throw new ArgumentException(string.Format(Strings.BadColumnCast, column.DataType, typeof(SByte)));
        }

        /// <summary>
        /// Gets the <see cref="Int16DataFrameColumn"/> with the specified <paramref name="name"/>.
        /// </summary>
        /// <param name="name">The name of the column</param>
        /// <returns><see cref="Int16DataFrameColumn"/>.</returns>
        /// <exception cref="ArgumentException">A column named <paramref name="name"/> cannot be found, or if the column's type doesn't match.</exception>
        public Int16DataFrameColumn GetInt16Column(string name)
        {
            DataFrameColumn column = this[name];
            if (column is Int16DataFrameColumn ret)
            {
                return ret;
            }

            throw new ArgumentException(string.Format(Strings.BadColumnCast, column.DataType, typeof(Int16)));
        }

        /// <summary>
        /// Gets the <see cref="UInt32DataFrameColumn"/> with the specified <paramref name="name"/>.
        /// </summary>
        /// <param name="name">The name of the column</param>
        /// <returns><see cref="UInt32DataFrameColumn"/>.</returns>
        /// <exception cref="ArgumentException">A column named <paramref name="name"/> cannot be found, or if the column's type doesn't match.</exception>
        public UInt32DataFrameColumn GetUInt32Column(string name)
        {
            DataFrameColumn column = this[name];
            if (column is UInt32DataFrameColumn ret)
            {
                return ret;
            }

            throw new ArgumentException(string.Format(Strings.BadColumnCast, column.DataType, typeof(string)));
        }

View on GitHub (pinned to 7b76e69cf9)

Solutions

  1. Check the column's actual type first: df.Columns["name"].DataType (or the column class name) and use the matching Get<ColumnType>Column accessor.
  2. Convert the column to short before access: df.Columns["name"] = df.Columns["name"].Cast<short>(), then call GetInt16Column.
  3. If the type can vary, access generically via df["name"] and inspect/convert values instead of using the typed accessor.
  4. Fix upstream data ingestion so the column is loaded as short.

Example fix

// before
var col = df.Columns.GetInt16Column("Level"); // throws if "Level" is int
// after
if (df.Columns["Level"].DataType == typeof(short))
{
    var col = df.Columns.GetInt16Column("Level");
}
else
{
    df.Columns["Level"] = df.Columns["Level"].Cast<short>();
    var col = df.Columns.GetInt16Column("Level");
}
Defensive patterns

Strategy: type-guard

Validate before calling

// before calling GetInt16Column
if (df.Columns.Contains("name") && df.Columns["name"].DataType != typeof(short))
    throw new InvalidOperationException($"Column 'name' is {df.Columns["name"].DataType}, expected short");

Type guard

static bool IsInt16Column(DataFrameColumn c) => c is Int16DataFrameColumn;
// usage: if (df.Columns["name"] is Int16DataFrameColumn shortCol) { ... }

Try / catch

try
{
    var col = df.Columns.GetInt16Column("name");
}
catch (ArgumentException ex) when (ex.Message.Contains("column"))
{
    // inspect df.Columns["name"].DataType, convert with .Cast<short>(), and retry
}

Prevention

When it happens

Trigger: Calling df.Columns.GetInt16Column("name") on a DataFrame whose column "name" exists but is not an Int16DataFrameColumn (e.g. it was loaded as Int32, byte, double, or string). The indexer this[name] succeeds, the `is Int16DataFrameColumn` pattern fails, and the ArgumentException at src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs:444 is thrown.

Common situations: Small-int CSV data inferred as Int32 or Int64; DB SMALLINT mappings; schema drift after a data source change; hardcoded column names pointing at a differently-typed column.

Understand the failure class

Background: Type mismatch errors: IllegalArgumentException, TypeError and type guards across 150 open-source libraries — this error's family across 150 libraries.

Related errors


AI-assisted analysis of dotnet/machinelearning@7b76e69cf9 (2026-09-11). Data as JSON: /api/errors/a1e799dce8abff04. Report an issue: GitHub.