Wanted to share a 'lil pro tip that you may find interesting. Just a concept that I don't see talked about often, and that is the idea that you can have multiple parented objects, functionally "layering" an animation.
Here, we have two characters holding hands. Zoey's hands are parented to Mira's hands, and those are animated for a foundational loop (just a basis, a "starting point", that we will heavily customize as the animation progresses).
That would normally be the end of it! Zoey's hands are parented to Mira's hands, and we animated Mira's hands, job done.
But! We can add a new empty (let's call it "hand.moving.empty", very creative). We can parent Mira's hands to this empty, and then add more animation to that. This preserves the base motion, while allowing us to non-destructively add customization to it. If at any point we're unhappy, we still have the main hand animation to fall back on.
A final touch; both hands are parented to the empty, but their values are different. One hand is at 100 percent (or "1.00"), and one is at 80 percent (or .8). This gives us just a bit more variance, so the hands are not perfectly mirrored (you normally don't want PERFECT symmetry in an animation, as life, and bodies, are usually asymmetrical, if only by a bit in our case).
I hope you found this interesting!