2014-07-05 73 views
0

在Python pandas,我可以很容易地下降重複與數據幀:C#deedle相當於熊貓df.drop_duplicates?

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

有沒有在C#中的任何或Deedle這是這個簡單而快速的?或者我需要遍歷整個框架(從一個大的CSV文件),以刪除重複?

我正在使用的數據是從大約40列和12k行的大型CSV文件導入的。對於每個日期,客戶編號都有多個條目。我需要消除每個日期重複的客戶編號行(只留下一個唯一的)。

下面是一些簡單的數據,使用日期和RECN如用於去dupify列:

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 
+0

你還需要排序嗎? – terrybozzio

+0

添加了一些簡化的數據。它實際上已經按原樣排序,在真實數據中,排序並不會受到影響(上面的測試數據沒有排序)。 – user3478193

回答

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(),因爲Deedle似乎不止一次運行了IEnumerable