C#Deedle相当于熊猫df.drop#U复制品?
在Python中,我可以通过以下方法轻松地在数据帧中删除重复项:C#Deedle相当于熊猫df.drop#U复制品?,c#,csv,duplicates,deedle,C#,Csv,Duplicates,Deedle,在Python中,我可以通过以下方法轻松地在数据帧中删除重复项: df1.drop_duplicates(['Service Date', 'Customer Number'], inplace=True) C#中有没有这么简单快捷的东西?或者我需要迭代整个帧(从一个大的CSV文件)来删除副本吗 我正在处理的数据是从一个大约有40列和12k行的大型CSV文件导入的。对于每个日期,都有多个客户编号条目。我需要消除每个日期重复的客户编号行(只留下一个唯一的) 以下是一些简化的数据,使用DATE和R
df1.drop_duplicates(['Service Date', 'Customer Number'], inplace=True)
C#中有没有这么简单快捷的东西?或者我需要迭代整个帧(从一个大的CSV文件)来删除副本吗
我正在处理的数据是从一个大约有40列和12k行的大型CSV文件导入的。对于每个日期,都有多个客户编号条目。我需要消除每个日期重复的客户编号行(只留下一个唯一的)
以下是一些简化的数据,使用DATE和RECN作为用于重复数据消除的列:
NAME, TYPE, DATE, RECN, COMM
Kermit, Frog, 06/30/14, 1, 1test
Kermit, Frog, 06/30/14, 1, 2test
Ms. Piggy, Pig, 07/01/14, 2, 1test
Fozzy, Bear, 06/29/14, 3, 1test
Kermit, Frog, 07/02/14, 1, 3test
Kermit, Frog, 07/02/14, 1, 4test
Kermit, Frog, 07/02/14, 1, 5test
Ms. Piggy, Pig, 07/02/14, 2, 3test
Fozzy, Bear, 07/02/14, 3, 2test
Ms. Piggy, Pig, 07/02/14, 2, 2test
在CSV阅读器功能中似乎没有这种实用程序。使用另一个CSV读取器加载数据(),我能够使用以下扩展方法消除重复数据:
public static class DeduplicateCsv
{
public static IEnumerable<Series<string, object>> ReadCsv(this string file)
{
// NuGet: PM> Install-Package LumenWorksCsvReader
using (var csv = new CsvReader(new StreamReader(file), true))
{
int fieldCount = csv.FieldCount;
string[] headers = csv.GetFieldHeaders();
while (csv.ReadNextRecord())
{
var seriesBuilder = new SeriesBuilder<string>();
for (int i = 0; i < fieldCount; i++)
{
seriesBuilder.Add(headers[i], csv[i]);
}
yield return seriesBuilder.Series;
}
}
}
public static IEnumerable<TSource> DistinctObject<TSource, TCompare>(this IEnumerable<TSource> source, Func<TSource, TCompare> compare)
{
var set = new HashSet<TCompare>();
return source.Where(element => set.Add(compare(element)));
}
public static IEnumerable<Series<string, object>> DeDupify(this IEnumerable<Series<string, object>> source, string key)
{
return source.DistinctObject(s => s.Get(key));
}
}
请注意,我必须在末尾添加一个
.ToList()
,因为Deedle似乎不止一次地运行IEnumerable
。您还需要排序吗?添加了一些简化的数据。它实际上已经按原样进行了排序,在实际数据中,排序不会有什么坏处(上面的测试数据没有排序)。
var frame = Frame.FromRows("data.csv"
.ReadCsv()
.DeDupify("Service Date")
.DeDupify("Customer Number")
.ToList()
);
frame.Print();