Perhaps you're looking for `pd.cut` + `pd.get_dummies`?
pd.get_dummies(pd.cut(
100 - df.Error_Rate,
bins=[0, 65, 80, 90, 100],
labels=['Below 65%', '65% - 80%', '80% - 90%', 'Above 90%'])
)
Below 65% 65% - 80% 80% - 90% Above 90%
0 0 0 0 1
1 0 0 1 0
2 0 1 0 0
3 0 0 1 0
4 0 0 1 0
5 0 1 0 0
6 1 0 0 0
7 0 1 0 0
8 0 1 0 0
9 1 0 0 0
10 1 0 0 0
11 1 0 0 0
12 1 0 0 0
13 1 0 0 0
Just out of curiosity I've taken a look at what happens under the hood, and I've used [dtruss/strace][1] on each test.
C++
./a.out < in
Saw 6512403 lines in 8 seconds. Crunch speed: 814050
syscalls `sudo dtruss -c ./a.out < in`
CALL COUNT
__mac_syscall 1
<snip>
open 6
pread 8
mprotect 17
mmap 22
stat64 30
read_nocancel 25958
Python
./a.py < in
Read 6512402 lines in 1 seconds. LPS: 6512402
syscalls `sudo dtruss -c ./a.py < in`
CALL COUNT
__mac_syscall 1
<snip>
open 5
pread 8
mprotect 17
mmap 21
stat64 29
[1]: http://en.wikipedia.org/wiki/Strace