How to write lowpass filter for sampled signal in Python?
The frequency response for the filter designed using the butter
function is:



But there is no reason to limit the filter to a constant monotonic
filter design.  If you desire a higher attenuation in the stopband
and steeper transition band, other options exist.  For more information
on specifying a filter using iirdesing see this.  As shown by
the frequency response plots for the butter design the cutoff 
frequency (-3dB point) is far from the goal.  This can be alleviated
by down-sampling before filtering (the design
functions will have a difficult time with such a narrow filter, 2% of 
the bandwidth).  Lets look at filtering the original sample 
rate with the cutoff specified.

import numpy as np
from scipy import signal
from matplotlib import pyplot as plt

from scipy.signal import fir_filter_design as ffd
from scipy.signal import filter_design as ifd

# setup some of the required parameters
Fs = 1e9           # sample-rate defined in the question, down-sampled

# remez (fir) design arguements
Fpass = 10e6       # passband edge
Fstop = 11.1e6     # stopband edge, transition band 100kHz
Wp = Fpass/(Fs)    # pass normalized frequency
Ws = Fstop/(Fs)    # stop normalized frequency

# iirdesign agruements
Wip = (Fpass)/(Fs/2)
Wis = (Fstop+1e6)/(Fs/2)
Rp = 1             # passband ripple
As = 42            # stopband attenuation

# Create a FIR filter, the remez function takes a list of 
# "bands" and the amplitude for each band.
taps = 4096
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000) 

# The iirdesign takes passband, stopband, passband ripple, 
# and stop attenuation.
bc, ac = ifd.iirdesign(Wip, Wis, Rp, As, ftype='ellip')  
bb, ab = ifd.iirdesign(Wip, Wis, Rp, As, ftype='cheby2') 




As mentioned, because we are trying to filter such a small percent
of the bandwidth the filter will not have a sharp cutoff.  In this
case, lowpass filter, we can reduce the bandwidth to get a better
looking filter.  The python/scipy.signal resample function can 
be used to reduce the bandwidth.

Note the resample function will perform filtering to prevent 
aliasing.  Prefiltering can also be perfomed (to reduce aliasing)
and in this case we could simply resample by 100 and be done, but
the question asked about creating filters.  For this example 
we will downsample by 25 and create a new filter

R = 25;            # how much to down sample by
Fsr = Fs/25.       # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)


If we update the design parameters for the FIR filter the 
new response is.

# Down sampled version, create new filter and plot spectrum
R = 25.             # how much to down sample by
Fsr = Fs/R          # down-sampled sample rate
Fstop = 11.1e6      # modified stopband
Wp = Fpass/(Fsr)    # pass normalized frequency
Ws = Fstop/(Fsr)    # stop normalized frequency
taps = 256
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000) 




The filter operating on the downsampled data has a better
response.  Another benefit of using a FIR filter is that you 
will have linear phase response.