{"record":{"id":"04ad29e6fc0d1e30","repo":"dotnet/machinelearning","slug":"training-data-has-0-rows","errorCode":null,"errorMessage":"Training data has 0 rows","messagePattern":"Training data has 0 rows","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.ML.AutoML/Utils/UserInputValidationUtil.cs","lineNumber":78,"sourceCode":"\n        public static void ValidateSamplingKey(string samplingKeyColumnName, string groupIdColumnName, TaskKind task)\n        {\n            if (task == TaskKind.Ranking && samplingKeyColumnName != null && samplingKeyColumnName != groupIdColumnName)\n            {\n                throw new ArgumentException($\"If provided, {nameof(samplingKeyColumnName)} must be the same as {nameof(groupIdColumnName)} for Ranking Experiments\", samplingKeyColumnName);\n            }\n        }\n\n        private static void ValidateTrainData(IDataView trainData, ColumnInformation columnInformation)\n        {\n            if (trainData == null)\n            {\n                throw new ArgumentNullException(nameof(trainData), \"Training data cannot be null\");\n            }\n\n            if (DatasetDimensionsUtil.IsDataViewEmpty(trainData))\n            {\n                throw new ArgumentException(\"Training data has 0 rows\", nameof(trainData));\n            }\n\n            foreach (var column in trainData.Schema)\n            {\n                if (column.Name == DefaultColumnNames.Features && column.Type.GetItemType() != NumberDataViewType.Single)\n                {\n                    throw new ArgumentException($\"{DefaultColumnNames.Features} column must be of data type {NumberDataViewType.Single}\", nameof(trainData));\n                }\n\n                if ((column.Name != columnInformation.LabelColumnName &&\n                    column.Name != columnInformation.UserIdColumnName &&\n                    column.Name != columnInformation.ItemIdColumnName &&\n                    column.Name != columnInformation.GroupIdColumnName)\n                    &&\n                        column.Type.GetItemType() != BooleanDataViewType.Instance &&\n                        column.Type.GetItemType() != NumberDataViewType.Single &&\n                        column.Type.GetItemType() != TextDataViewType.Instance)\n                {","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.ML.AutoML/Utils/UserInputValidationUtil.cs#L60-L96","documentation":"Thrown by UserInputValidationUtil.ValidateTrainData when the supplied IDataView is non-null but contains zero rows, as determined by DatasetDimensionsUtil.IsDataViewEmpty. AutoML cannot train or split an empty dataset, so the input is rejected with an ArgumentException naming trainData.","triggerScenarios":"Passing an IDataView built from an empty file, an empty DataFrame, a filtered view (e.g. after a FilterRowsByColumn predicate excluding everything), or an empty enumerable via LoadFromEnumerable.","commonSituations":"CSV with only a header row; date-range or category filters that exclude all rows at runtime; upstream ETL job produced no output; test fixture files empty after truncation.","solutions":["Check trainData.GetRow count / row cursor before executing; ensure the dataset has at least one row","Fix the filter/query that eliminated all rows","Verify the source file or enumerable actually contains data rows, not just a header"],"exampleFix":"// before\nvar data = mlContext.Data.LoadFromEnumerable(items.Where(x => x.Year == requestedYear));\nvar result = experiment.Execute(data, nameof(ModelInput.Label), \"A\");\n\n// after\nvar filtered = items.Where(x => x.Year == requestedYear).ToList();\nif (filtered.Count == 0) throw new InvalidOperationException(\"No training rows match the filter\");\nvar data = mlContext.Data.LoadFromEnumerable(filtered);\nvar result = experiment.Execute(data, nameof(ModelInput.Label), \"A\");","handlingStrategy":"validation","validationCode":"long rowCount = 0;\nusing (var cur = trainData.GetRowCursor(trainData.Schema))\n    while (cur.MoveNext()) { rowCount++; break; }\nif (rowCount == 0) throw new InvalidOperationException(\"Training data has no rows\");","typeGuard":null,"tryCatchPattern":"try { var r = experiment.Execute(data, label, \"A\"); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"0 rows\")) { /* surface upstream ETL failure */ }","preventionTips":["Assert row count > 0 after every data load/filter step","Log source row counts in the ETL pipeline to catch empty outputs early","Keep header-only and empty fixture files out of test data directories"],"tags":["dotnet","mlnet","automl","empty-data","training-data"],"backgroundTag":"empty-required-field","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"}