filtfilt giving unexpected results
So the issue is that your filter order is too high.  There are 2 problems with this:

SciPy has a bug that generates inaccurate filters at high orders.
On any platform, higher-order filters cannot be done in a single stage.

SciPy bug:
SciPy was previously generating prototype filters as a list of poles and zeros, then converting them to transfer functions, then transforming them to their new frequency and band-type, then converting them back into poles and zeros.  This is bad because transfer function representation has numerical problems and loses precision.  So your filter currently has these poles and zeros:

but it's supposed to look like this:

This probably isn't your problem, since these poles and zeros are still approximately the bandpass filter you asked for.  At even higher orders the poles can be so wrong they jump outside the unit circle and make the filter explode.  This has been fixed in SciPy 0.14.0, as long as you use output='zpk'.
Second-order sections:
When you actually do the filtering, you have to use a transfer function, not a list of poles and zeros, so your high-order filter would suffer the same numerical corruption if you tried to do the entire filter in a single stage.  What we do instead is (starting from the list of poles and zeros, not from the inaccurate transfer function) break up the filter into second-order sections, which each have minimal numerical problems, and cascade the sections together to get the final equivalent output.
This is true for any platform, hardware or software, but Matlab and Octave have functions like sosfilt to do the work for you.  SciPy does not, but it will in the future.
For now, you can break up the sections manually and use lfilter repeatedly with each section to get the desired output or copy the code from that pull request.
Update
SciPy has SOS now.  So the best general-purpose filtering method is to generate your filter in SOS format, something like:
sos = butter(order, [low, high], btype='band', output='sos')

and then filter using sosfiltfilt:
y = sosfiltfilt(sos, data)