0

在 Pythonpandas中,我可以轻松地在 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
4

1 回答 1

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

请注意,我必须.ToList()在最后加上 a,因为 Deedle 似乎不止一次地跑过IEnumerable

于 2014-07-05T23:41:45.343 回答