Global dataframes - good or bad
Yes. Instead of using globals, you should wrap your data into an object and pass that object around to your functions instead (see dependency injection).
Wrapping it in an object instead of using a global will :

Allow you to unit test your code. This is absolutely the most important reason. Using globals will make it painfully difficult to test your code, since it is impossible to test any of your code in isolation due to its global nature.
Perform operations on your code safely without the fear of random mutability bugs
Stop awful concurrency bugs that happen because everything is global.
I have a program that i load millions of rows into dataframes, and i declare them as global so my functions (>50) can all use them like i use a database in the past.  I read that using globals are a bad, and due to the memory mapping for it, it is slower to use globals. 
I like to ask if globals are bad, how would the good practice be? passing > 10 dataframes around functions and nested functions dont seems to be very clean code as well. 
Recently the program is getting unwieldy as different functions also update different cells, insert, delete data from the dataframes, so  i am thinking of wrapping the dataframes in a class to make it more manageable. Is that a good idea?