在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
答案 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
。