C#Deedle相当于熊猫df.drop#U复制品?

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

在Python中,我可以通过以下方法轻松地在数据帧中删除重复项:

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();