How would I go about finding the optimal way to split up an order
Some advice too large for a comment:
As @Erwin Kalvelagen alludes to, this problem can be described as a math program, which is probably the most common-sense approach.
The generalized plan of attack is to figure out how to create an expression of the problem using some modeling package and then turn that problem over to a solver engine which uses diverse techniques to find the optimal answer.
cvxpy is certainly 1 of the options to do the first part with.  I'm partial to pyomo, and pulp is also viable.  pulp also installs with a solver (cbc) which is suitable for this type of problem.  In other cases, you may need to install separately.
If you take this approach, look through a text or some online examples on how to formulate a MIP (mixed integer program).  You'll have some sets (perhaps items, suppliers, etc.), data that form constraints or limits, some variables indexed by the sets, and an objective....likely to minimize cost.
Forget about the complexities of split-orders and combined shipping at first and just see if you can get something working with toy data, then build out from there.
I have a problem (that I think I'm over complicating) but for the life of me I can't seem to solve it.
I have 2 dataframes. One containing a list of items with quantities that I want to buy. I have another dataframe with a list of suppliers, unit cost and quantity of items available. Along with this I have a dataframe with shipping cost for each supplier.
I want to find the optimal way to break up my order among the suppliers to minimise costs.
Some added points:

Suppliers won't always be able to fulfil the full order of an item so I want to also be able to split an individual item among suppliers if it is cheaper
Shipping only gets added once per supplier (2 items from a supplier means I still only pay shipping once for that supplier)

I have seen people mention cvxpy for a similar problem but I'm struggling to find a way to use it for my problem (never used it before).
Some advice would be great.
Note: You don't have to write all the code for me but giving a bit of guidance on how to break down the problem would be great.
TIA