Many users want to use intuitive rows and columns rather than the standard zero-indexed form since it is less intuitive, or natural. This is all fine and good, but the main body of code should not be modified, only the inputs.
The board is a list of lists. We cannot alter the way Python treats lists.
['O', 'O', 'O', 'O', 'O']
0 1 2 3 4 => column index
[ row index
['O', 'O', 'O', 'O', 'O'], => 0
['O', 'O', 'O', 'O', 'O'], => 1
['O', 'O', 'O', 'O', 'O'], => 2
['O', 'O', 'O', 'O', 'O'], => 3
['O', 'O', 'O', 'O', 'O'], => 4
There is no need to modify any code as those changes will lead to bugs and difficult to spot errors.
guess_row = int(raw_input("Enter a row: ")) - 1
This will let the user input natural numbers (be sure to label your columns and rows) but the program will function as though index numbers were inputed. Where this might get tricky is if a user is inputing
0..4 when your inputs are fashioned for natural numbers. That means having extra logic centered around the user input cycle.
if guess_row in range(5) and guess_col in range(5):
is the built in logic that our starter program uses which assumes
0..4 as inputs. If we add in extra logic to restrict and validate inputs, then this line won't be needed.
Where we see people run into issues is in pinpointing the correct element on the board.  ...  is the full range of the board. That has to be adhered to if we are to reference the correct element.
My advice to many users is to complete the unit without deviating from the instructions. When followed as given, and in the correct order, the program does run as expected. Can it be improved upon? Certainly, but in the lesson is not the place to do it. Make the program function as directed, pass the unit, then go to town on ways to improve it, off the track.