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

Viewed 29

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!!!

1 Answers

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']
Related