In the ArcGIS Python API, there is actually a method for converting you GeoPandas frame to Esri's "GeoAccessor".
https://developers.arcgis.com/python/api-reference/arcgis.features.toc.html#geoaccessor
Once your data is in a GeoAccessor, you can use GeoAccessor.spatial.to_featureset() to generate a featureset that can be applied directly to a table.
The "append" method in the API is far more trouble than it's worth, so we can just use "edit_features" on the feature layer object.
from arcgis.features import GeoAccessor
# your current process goes here where you build your geodataframe
# let's assume your geodataframe is called "gdf"
# you also truncated the layer already, so let's assume that featurelayer objected is called "fl"
# convert to geoaccessor
sdf = GeoAccessor.from_geodataframe(gdf)
# convert to featureset
fs = sdf.spatial.to_featureset()
# apply edits
fl.edit_features(adds=fs)
The documentation suggests doing your edits in batches if there is a very large number of features.
Also, if you're certain that the data all needs to be refreshed, truncating and appending is fine. But if some of the features don't actually change, consider using the pandas method compare. You'd have to query the hosted layer to its own dataframe, but once you have it, you can compare the two frames to identify which specific rows and columns have changed.
We've moved many of our scripts to that model. Our parcels layer, for instance, has about 60k features in it, but on a given day, only about 300 parcels are edited, and those only in a few columns like owner name. By isolating the specific attributes edited, our actual edits are kept to a minimum, and the layer is never empty.
- Josh Carlson
Kendall County GIS