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

时间:2019-08-18 18:09:05

标签: c# dataframe missing-data deedle

我正在尝试在Deedle C#数据帧中转发填充值,就像在python中使用pandas.ffill()函数一样。正向填充熊猫,允许在行和列索引处都进行正向填充。我想在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();

1 个答案:

答案 0 :(得分:3)

首先,您在调用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();

您还可以转置数据帧,然后填充缺失的值然后转回它(这是表达所需内容的一种很好的方式,但是与仅使用Select相比,摆放可能会更耗时。 ):

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