0

我应该如何处理 deedle 系列中的缺失值?

例如,我有一个包含字段Name和的系列,最初是BirthDate在哪里,我需要转换为.BirthDateDateTime?BirthDateString

var newDOB = df.GetColumn<DateTime?>("DOB").Select(x => x.Value.Value != null ? x.Value.Value.ToString("dd/MM/yyyy") : " ");
df.ReplaceColumn("DOB", newDOB);

这是我尝试过的,但它不起作用。对我来说,将缺失DateTime?值转换为的最佳方法是string什么?在 C# 中处理 Deedle 系列和 Deedle 数据帧中的缺失值的最佳方法是什么?

4

1 回答 1

2

当您创建 Deedle 系列时,Deedle 会自动检测无效值并将其视为缺失 - 因此,当您使用NaNor创建系列时null,这些值会自动转换为缺失值(这也适用于可空值)。

此外,该Select方法会跳过所有缺失值。例如,考虑这个系列:

Series<int, DateTime?> ds = Enumerable.Range(0, 100).Select(i => 
  new KeyValuePair<int, DateTime?>(i, i%5==0 ? (DateTime?)null : DateTime.Now.AddHours(i))
 ).ToSeries();
ds.Print();

在这里,Deedle 认识到每五个值都丢失了。当您调用 时Select,它仅将操作应用于有效值,并且每五个值保持为缺失值:

  ds.Select(kvp => kvp.Value.Value.ToString("D")).Print();

如果你想对缺失的值做一些事情,你可以使用FillMissing(用指定的字符串填充它们或从系列中的前一个项目复制值)或DropMissing从系列中丢弃它们。您还可以使用SelectOptional它来调用您的函数,OptionalValue<V>这样您就可以为缺失值实现自己的自定义逻辑。

这也意味着,如果你有Series<K, DateTime?>,它真的不是很有用,因为这些null值都是由 Deedle 处理的——所以你可以把它变成Series<K, DateTime>using Select(kvp => kvp.Value.Value),让 Deedle 为你处理缺失的值。

于 2015-08-12T19:33:05.930 回答