如何处理 C# 中 deedle 系列中的空值(缺失)?

How to deal with null (missing) values in a deedle series in C#?

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

例如,我有一个包含字段 NameBirthDate 的系列,其中 BirthDate 最初是 DateTime?,我需要将 BirthDate 转换为String.

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 数据帧中缺失值的一般最佳方法是什么?

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

此外,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>使用 Select(kvp => kvp.Value.Value) 并让 Deedle 为您处理缺失值。