{"record":{"id":"06e194f4921fc8f7","repo":"dotnet/machinelearning","slug":"value-cannot-be-null-parameter-idcolumns","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'idColumns')","messagePattern":"Value cannot be null\\. \\(Parameter 'idColumns'\\)","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.Data.Analysis/DataFrame.cs","lineNumber":753,"sourceCode":"        /// Note: The output rows are ordered by value column (all rows for the first value column,\n        /// then all rows for the second, etc.), which differs from pandas.melt() which orders by\n        /// source row.\n        /// </remarks>\n        public DataFrame Melt(IEnumerable<string> idColumns, IEnumerable<string> valueColumns = null, string variableName = \"variable\", string valueName = \"value\", bool dropNulls = false)\n        {\n            if (string.IsNullOrWhiteSpace(variableName))\n            {\n                throw new ArgumentException(Strings.ParameterMustNotBeNullOrWhitespace, nameof(variableName));\n            }\n\n            if (string.IsNullOrWhiteSpace(valueName))\n            {\n                throw new ArgumentException(Strings.ParameterMustNotBeNullOrWhitespace, nameof(valueName));\n            }\n\n            if (idColumns == null)\n            {\n                throw new ArgumentNullException(nameof(idColumns));\n            }\n\n            var idColumnList = idColumns.ToList();\n\n            HashSet<string> idColumnSet = null;\n\n            if (valueColumns is null)\n            {\n                idColumnSet = [.. idColumnList];\n            }\n\n            var valueColumnList = valueColumns?.ToList()\n                ?? _columnCollection\n                    .Where(c => !idColumnSet.Contains(c.Name))\n                    .Select(c => c.Name)\n                    .ToList();\n\n            if (idColumnList.Count == 0)","sourceCodeStart":735,"sourceCodeEnd":771,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.Data.Analysis/DataFrame.cs#L735-L771","documentation":"Thrown by DataFrame.Melt when the idColumns argument is null. Melt requires at least one identifier column to keep per-row during the wide-to-long reshape. Raised as a standard ArgumentNullException naming 'idColumns'.","triggerScenarios":"Calling df.Melt(null, valueColumns) explicitly, or a variable that is null being passed as idColumns.","commonSituations":"Piping a nullable collection from config or a previous query that returned null; overloading the default parameter to null then calling without a real list.","solutions":["Pass a non-empty collection of existing ID column names, e.g. new[] { \"Id\" }","Check the source collection for null before calling Melt","Use an empty-list default and rely on the Count==0 validation instead of null"],"exampleFix":"// before\ndf.Melt(null, values);\n// after\ndf.Melt(new[] { \"Id\", \"Date\" }, values);","handlingStrategy":"validation","validationCode":"if (idColumns == null || !idColumns.Any()) throw new InvalidOperationException(\"idColumns must contain at least one column\");","typeGuard":null,"tryCatchPattern":"try { df.Melt(idColumns, valueColumns); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"idColumns\") { /* provide defaults and retry */ }","preventionTips":["Initialize idColumns with a concrete list, never leave it null","Null-check collections sourced from config or queries","Use empty-list semantics plus validation instead of null"],"tags":["dotnet","dataframe","melt","null-argument"],"backgroundTag":"null-argument","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}