DataFrame过滤行出现string转int错误,列类型确为System.String
解决DataFrameRow索引列时的“string转int”类型错误
问题场景
要过滤DataFrame中包含指定字符串的行,已知目标列类型为System.String,但使用row["stringcolumn"]、row.GetAs<string>("stringcolumn")、强制类型转换或ToString()等写法时,均触发Roslyn CS1503错误:Argument 1: cannot convert from 'string' to 'int'。
错误原因
你使用的DataFrameRow索引器仅支持整数类型的列位置索引,不支持直接传入字符串列名。也就是说,row[]的参数只能是列在DataFrame中的序号,不能是列名字符串,这才导致了“字符串转整数”的类型转换错误。
解决方案
方案1:先获取列索引,再用整数索引访问
先通过列名拿到对应的位置序号,再用整数索引操作行数据:
// Load the data into the data frame var dataFrame = DataFrame.LoadCsv(dataPath); // 获取目标列的索引位置 int targetColumnIndex = dataFrame.Columns.IndexOf("stringcolumn"); List<string> stringsToRemove = new List<string> {"string123", "stringabc"}; // 定义过滤条件 Func<DataFrameRow, bool> filterCondition = row => { string cellValue = row.GetAs<string>(targetColumnIndex); return !stringsToRemove.Contains(cellValue); }; // 应用过滤 var filteredDataFrame = dataFrame.Filter(filterCondition);
方案2:直接操作列对象(更高效)
跳过逐行操作,直接通过DataFrame的列对象构建过滤掩码,性能更优:
var dataFrame = DataFrame.LoadCsv(dataPath); // 获取目标列 StringDataColumn targetColumn = (StringDataColumn)dataFrame.Columns["stringcolumn"]; List<string> stringsToRemove = new List<string> {"string123", "stringabc"}; // 构建过滤掩码:保留不在移除列表中的行 var keepMask = targetColumn.Values.Select(val => !stringsToRemove.Contains(val)).ToArray(); // 应用过滤 var filteredDataFrame = dataFrame.Filter(keepMask);
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

