Forum Discussion

ven853's avatar
ven853
Regular Visitor
7 years ago
Solved

Average

I have null values in my column identified as 999.9.  I need to replace them with the average of the row above and the row below.  In some circumstances like shown below, the row below is also a null...
  • v-jiascu-msft's avatar
    7 years ago

    Hi ven853,

     

    To be honest, it's hard to achieve it using Power Query. I would suggest you leverage the power of Python and R. I created a demo solution with both Python and R. You can choose the best one that suits you. You can download it from the attachment. 

    # 'dataset' holds the input data for this script
    
    def find_next(excluded, ds):
        for item in ds:
            if item != excluded:
                return item
        return 0
    
    result = []
    column1 = dataset.iloc[:, 0]
    for index in range(len(column1)):
        if column1[index] != 999.9:
            result.append(column1[index])
        else:
            next = find_next(999.9, column1[index + 1:])
            result.append((next + result[-1]) / 2)
    dataset["new"] = result
    # 'dataset' holds the input data for this script
    
    find_next <- function(excluded, ds) {
        for (item in ds[,1]) {
            if (item != excluded) {
                return(item)
            }
        }
        return(0)
    }
    
    result <- c()
    ds_length <- nrow(dataset)
    for (index in 1: ds_length) {
        if (dataset[index, 1] == 999.9) {
            result[index] <- (tail(result, 1) + find_next(999.9, tail(dataset, -index))) / 2.0
        }
        else{
            result[index] <- dataset[index, 1]
        }
    }
    final <- data.frame(result)

    Average

     

    Best Regards,
    Dale