C# Deedle Dataframe ReplaceColumn <MIssing> 值

C# Deedle Dataframe ReplaceColumn <MIssing> values

我很难弄清楚这个问题。首先,我是 Deedle 的新手,如果我在这里问一个愚蠢的问题,请原谅我。

所以我有一个父框架,我正在过滤产生一个子框架

var subFrame = parentFrame.Where(kvp => kvp.Value.GetAs<string>("ColA") == "ValueA" && kvp.Value.GetAs<string>("ColB") == "ValueB");

var subCol = subFrame.GetColumn<decimal>("ColDecimal1");
subCol = subFrame.GetColumn<decimal>("ColDecimal2");

parentFrame.ReplaceColumn("ColDecimal1", subCol);

当我这样做时,它几乎给了我想要的结果。列值确实与父行的键值对齐,但是,与最初通过 subFrame/filtering 获取的键值不匹配的键的“ColDecimal1”值为 。我知道这是 Deedle 文档中所述的内容,但我正试图找到解决此问题的方法。我的偏好可能是在 C# 和 F# 中获得一些示例,F# 对我来说有点陌生,所以很难理解。

无论如何,先谢谢你了。

subFrame 只有部分行的数据(由您的过滤器指定)。 ReplaceColumn 将替换一个列,为新列没有值的所有行键添加 <Missing>,这就是为什么你看到你所看到的。

如果您希望得到的结果是过滤器选择的行的新值,但所有其他行的旧值,您可以使用 ZipSelect.

例如,假设我有两个系列:

let parentCol = series [1 => 1.0; 2 => 2.0; 3 => 3.0]
let subCol = series [1 => 1.1 ]

subCol 有键 1 的数据。现在,我想将 parentCol 中的值 1.0 替换为 subCol 中的值,以便在 F# 中执行此操作,您将编写(假设 [=21= 中没有缺失值) ]):

parentCol.Zip(subCol, JoinKind.Left).SelectValues(fun (v1, v2) ->
  if v2.HasValue then v2.Value else v1.Value
)

C# 中唯一不同的是您使用 Item1Item2 以及不同的 lambda 语法访问元组元素。我没有测试这个,但应该是:

parentCol.Zip(subCol, JoinKind.Left).SelectValues(v =>
  v.Item2.HasValue ? v.Item2.Value : v.Item1.Value);