Изначально this.props.weather будет неопределенным, поэтому перед выполнением .map необходимо выполнить условную проверку, как двумя способами
this.props.weather && this.props.weather.map
OR
Array.isArray(this.props.weather) && this.props.weather.map
Также при работе с .map необходимо передавать данные о погоде в метод renderWeather, потому что он ожидает данные, но вы не передаете ему данные в .map
Изменение
{this.props.weather.map(this.renderWeather)}
К
{Array.isArray(this.props.weather) && this.props.weather.map(item => this.renderWeather(item))}
Также установите уникальный ключ для элемента tr здесь
renderWeather(cityData){
return(
<tr key={cityData.city && cityData.city.id}> //if you do not have unique id then use index as key
<td>{cityData.city && cityData.city.name}</td>
</tr>
);
}
или если ваши данные не содержат уникальный идентификатор, используйте индекс в качестве ключа
{Array.isArray(this.props.weather) && this.props.weather.map((item, index) => this.renderWeather(item, index))}
Также установите уникальный ключ для элемента tr здесь
renderWeather(cityData, index){
return(
<tr key={"city-"+index}> //if you do not have unique id then use index as key
<td>{cityData.city && cityData.city.name}</td>
</tr>
);
}