如何转发填充 C# 数据框中的缺失值

我正在尝试在 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();


杨__羊羊
浏览 78回答 1
1回答

慕容3067478

首先,您调用rawDf.FillMissing然后打印的第二组示例rawDF不会执行任何操作,因为 Deedle 数据帧(大部分)是不可变的。诸如FillMissing返回新的(填充的)数据框之类的操作并且不修改原始数据框。因此,使用操作的正确方法就像在第一组示例中一样,将结果分配给一个新变量,然后打印它。我遇到的第二个问题是,当您从(例如)CSV 文件读取示例数据时,文件中的空字符串不会被视为缺失值,而是被视为有效(空)字符串值。如果您使用Select空字符串并将其转换为:,Deedle 可以将这些值视为缺失值null: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();您还可以转置数据框,然后填充缺失的值,然后将其转回(这是表达您需要的内容的很好的方式,但转置可能比仅使用更耗时)Select:var fillRight = dfEmpty.Transpose().FillMissing(Direction.Forward).Transpose()
打开App,查看更多内容
随时随地看视频慕课网APP