【问题标题】:How to forward fill missing values in a C# data frame如何在 C# 数据框中转发填充缺失值
【发布时间】:2019-08-18 18:09:05
【问题描述】:

我正在尝试在 Deedle C# 数据框中转发填充值,就像在 python 中使用 pandas.ffill() 函数一样。 pandas 中的前向填充允许在行索引和列索引处前向填充。我想在 Deedle 中做同样的事情,在同一行但从不同的列中获取最近的非缺失值,因此跨行,这在 python 和 pandas 中非常简单。我是 C# 和 Deedle 库的新手,我在文档中只能找到如何在一个系列中转发填充值而不是跨数据框。非常感谢任何帮助,我是新手,我似乎无法在任何地方找到该库的任何实质性示例。

这是我的数据框的一个示例,我正在尝试跨行转发填充值。因此,col3 中缺失值的填充值将成为 col2 等同一行中的最后一个值。

-------- rawDF ------
col1 col2 col3
AAA  BBB    
CCC  DDD  EEE
FFF     
BBB  AAA    
DDD  CCC    
EEE  FFF
AAA     
BBB  CCC    
AAA     
FFF  AAA    
DDD 

Deedle 文档中为 C# 和 F# 提供的示例仅填充系列中的值,如图所示。如果我尝试 FillMissing();在整个数据框中,我什么都没有返回。

//Fill with previous available value in the series
var fillFwd = col2.FillMissing(Direction.Forward);
fillFwd.Print();

//Fill with the next available value
var fillBwd = col2.FillMissing(Direction.Backward);
fillBwd.Print()

---- nothing happens with the following ----

//forward fill all values in the DF
rawDF.FillMissing(Direction.Forward);
rawDF.Print();

//backward fill all values in the DF

//fill values in the DF with a constant value
rawDF.FillMissing(0);
rawDF.Print();

【问题讨论】:

    标签: c# dataframe missing-data deedle


    【解决方案1】:

    首先,您调用rawDf.FillMissing 然后打印rawDF 的第二组示例不执行任何操作,因为Deedle 数据帧(大部分)是不可变的。 FillMissing 之类的操作返回一个新的(填充的)数据框,并且不修改原始数据框。因此,使用操作的正确方法是在您的第一组示例中,您将结果分配给一个新变量,然后打印它。

    我遇到的第二个问题是,当您从(例如)CSV 文件中读取样本数据时,文件中的空字符串不会被视为缺失值,而是被视为有效(空)字符串值。如果您使用 Select 并将空字符串转换为 null,Deedle 可以将这些视为缺失值:

    var df = Frame.ReadCsv("C:/temp/aa.csv");
    var dfEmpty = df.SelectValues((string s) => (s == "") ? null : s);
    

    现在您应该看到当您像以前一样使用FillMissing 操作时发生了一些事情:

    var fillFwd = dfEmpty.FillMissing(Direction.Backward);
    fillFwd.Print();
    

    正如您正确指出的那样,这并不能满足您的要求-它会从上到下填充值。您想从左到右填充数据。一种方法是使用Select,它可以让您单独转换每一行:

    var fillRight = Frame.FromRows(dfEmpty.Rows.Select(row => 
      row.Value.FillMissing(Direction.Forward)));
    fillRight.Print();
    

    您还可以转置数据框,然后填充缺失的值,然后将其转回(这是表达您需要的非常好的方式,但 trnasposition 可能比仅使用 Select 更耗时):

    var fillRight = dfEmpty.Transpose().FillMissing(Direction.Forward).Transpose()
    

    【讨论】:

    • 谢谢!这很好用。我读过关于不可变性的文章,但我认为只是迷失了这一切。
    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多