我正在嘗試在 Deedle C# 數據框中轉發填充值,就像在 python 中使用 pandas.ffill() 函數一樣。pandas 中的前向填充允許在行索引和列索引處前向填充。我想在 Deedle 中做同樣的事情,在同一行但從不同的列中獲取最近的非缺失值,因此跨行,這在 python 和 pandas 中非常簡單。我對 C# 和 Deedle 庫都很陌生,我在文檔中能找到的只是如何在一系列內而不是跨數據幀轉發填充值。非常感謝任何幫助,我對此很陌生,而且我似乎無法在任何地方找到該庫的任何實質性示例。這是我的數據框的示例,我正在嘗試向前填充各行的值。因此,col3 中缺失值的填充值將成為 col2 同一行中的最后一個值,等等。-------- rawDF ------col1 col2 col3AAA BBB CCC DDD EEEFFF BBB AAA DDD CCC EEE FFFAAA BBB CCC AAA FFF AAA DDD Deedle 文檔中針對 C# 和 F# 提供的示例僅填充所示系列中的值。如果我嘗試 FillMissing(); 在整個數據框中我什么也沒返回。//Fill with previous available value in the seriesvar fillFwd = col2.FillMissing(Direction.Forward);fillFwd.Print();//Fill with the next available valuevar fillBwd = col2.FillMissing(Direction.Backward);fillBwd.Print()---- nothing happens with the following ----//forward fill all values in the DFrawDF.FillMissing(Direction.Forward);rawDF.Print();//backward fill all values in the DF//fill values in the DF with a constant valuerawDF.FillMissing(0);rawDF.Print();
1 回答

慕容3067478
TA貢獻1773條經驗 獲得超3個贊
首先,您調用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()
- 1 回答
- 0 關注
- 113 瀏覽
添加回答
舉報
0/150
提交
取消