I have a dataframe and need to insert rows in the middle based on a condition, if the condition is met, I need to add rows based on previous and next row values. So far I have this
for index, row in df.iterrows(): last_row = df.iloc[index-1] next_row = df.iloc[index+1] new_row = { 'SystemID' : last_row.SystemID, 'StartDateTime' : last_row.EndDateTime, 'EndDateTime' : next_row.StartDateTime, 'Date' : last_row.Date, 'Duration':0, 'EventCodeType':"PL", 'Shift':last_row.Shift, 'ProductCode':last_row.ProductCode, 'Machine&Fault':"Producing" } new_row = {k:v for k,v in new_row.items()} if index == last: break else: if index != 0 : #condition if (df.iloc[index]['StartDateTime'] != df.iloc[index - 1]['EndDateTime']): df.loc[index+1] = new_row # This line is giving error continue
But when I’m trying to insert row(last line of code), it is throwing an error IndexError: single positional indexer is out-of-bounds for the code(next_row = df.iloc[index+1])
the data looks like this
[![enter image description here][1]][1]
Update: I used the below logic as suggested in one of the answers
for index, row in df.iterrows(): try: if index == df.shape[0]: break else: last_row = df.iloc[index-1] next_row = df.iloc[index] new_row = { 'SystemID' : last_row.SystemID, 'StartDateTime' : last_row.EndDateTime, 'EndDateTime' : next_row.StartDateTime, 'Date' : last_row.Date, 'Duration':0 , 'EventCodeType':"PL", 'Shift':last_row.Shift, 'ProductCode':last_row.ProductCode, 'Machine&Fault':"Producing" } new_row = {k:v for k,v in new_row.items()} if index != 0 and index!=df.shape[0]: if (df.iloc[index]['StartDateTime'] != df.iloc[index - 1]['EndDateTime']): df1 = df1.append(new_row, ignore_index=True) continue except: continue
Put the code in a try catch exception and append the new rows in a new dataframe and concat the two dataframes [1]: https://i.stack.imgur.com/mFVBT.png
Advertisement
Answer
You are trying to add a row beyond the dataframe’s scope (size/capacity, so to say). You can get the the size of dataframe by using dataframe.shape()
.
If you need to, you would have to extend the index of the dataframe using set_index()
when you try to add a row at the end/after the last row. This should solve your issue.
You could also use dataframe.append()
to add new rows.
Another possible solution would be to use integer slicing with iloc
. iloc
doesn’t give an error with slicing, but again, going beyond the scope of the dataframe would still be an issue you have to fix before appending anyhting.