Search code examples
pythonpandasloopsfillna

Is there any way to create a loop which fills down values to the next empty 5 rows in a column?


I have a dtype: object column in my df and I would like to fill down values to the empty cells. None of my attempts made the job for me including df.fillna(method='ffill', inplace=True).

So what I did was I converted the column into a list, created a list with values I want to fill down in my column and run the following loop:

a = ['nan', 'nan', 'nan', 'Loaded volume_Road', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'Loaded volume_Rail', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan']
Name = ["Loaded volume_Road", "Loaded volume_Rail"]

for x in range(len(a)):
    if a[x] not in Name:
        a[x] = a[x-1]
print(a)     

#output:
a = ['nan', 'nan', 'nan', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail']

Then I inserted the list values into my column and this basically did the job.

However later I realised that I need only to fill down value for the next 5 rows as follows:

#current output:
a = ['nan', 'nan', 'nan', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail']

#desired output:
a = ['nan', 'nan', 'nan', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan']

Do you have guys any tips how to achieve the #desired output? I run out of ideas :-(

Many thanks!!!


Solution

  • Try this

    indexes = [i for i in range(len(a)) if a[i] != 'nan']
    
    for idx in indexes:
        a[idx: idx + 6] = [a[idx]] * 6
    print(a)
    

    Output:

    ['nan', 'nan', 'nan', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'Loaded volume_Road', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'Loaded volume_Rail', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan', 'nan']