Olá, Vinícius! Tudo bom?
Quando tratamos de um pd.DataFrame ou um numpy.array acontece de termos mais de uma dimensão a ser avaliada, por isso é interessante usar o atributo shape, para verificar todas as dimensões de linhas, colunas e outras mais.
Mas o shape[0] e o len(df) retornam a quantidade de linhas, então possuem a mesma resposta, logo não tem problema permutar entre eles. Mas prefira utilizar um padrão na construção do seu código.
Se em algum momento precisar usar o shape[1] para iterar sobre as colunas, então é interessante padronizar o uso do shape também para as linhas.
Se ainda tiver alguma dúvida, estou por aqui. Ótimos estudos e grande abraço!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!