C#Deedle相当于pandas df.drop_duplicates?

时间:2014-07-05 21:09:20

标签: c# csv duplicates deedle

在Python pandas中,我可以轻松地在DataFrame中删除重复项:

df1.drop_duplicates(['Service Date', 'Customer Number'], inplace=True)

C#或Deedle中有什么东西可以这么简单快速吗?或者我是否需要遍历整个帧(从大型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

1 个答案:

答案 0 :(得分:1)

Deedle似乎在其CSV阅读器功能中没有那种实用程序。使用另一个CSV阅读器加载数据(LumenWorks CSV Reader)我能够使用这些扩展方法对数据进行重复数据删除:

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

以下是我如何使用它:

var frame = Frame.FromRows("data.csv"
    .ReadCsv()
    .DeDupify("Service Date")
    .DeDupify("Customer Number")
    .ToList()
    );
frame.Print();

请注意,由于Deedle似乎不止一次在.ToList()上运行,因此我必须在最后添加IEnumerable