Separate scrap and production by area
efficiency

Overall, the code looks idiomatic and sensible, no major issues. But you want to tweak it for efficiency. Here are some things you might try.

Most importantly, instrument elapsed time, so you can tell if a tweak is useful:

    t0 = time.time()
    ...
    elapsed = time.time() - t0


And definitely use the profiler, so you know where to focus your efforts.

Ok, with that in hand, it looks like you need to synthesize some boolean columns. There are several columns that you repeatedly inspect, e.g. Transaction Description. Perhaps you could add them to the spreadsheet, to avoid repeatedly processing unchanging data? Another approach would be to build up a list of rows and then do data = pd.DataFrame(rows). This would let you examine each Transaction Description once and derive a couple of columns. But frankly, I'm skeptical this would improve your timings at all, the code looks fine as is.

style

Do use a pep8 linter: flake8, and follow its advice.

In hard-to-read identifiers like spinscrap, introduce an underscore so it is clear to the Gentle Reader where word breaks are.