It probably wouldn't make that big a difference to switch rows into columns, it was more or less a "desperate" advice.

If you only have around 400 bytes for level data I doubt you can do anything magically to have that many levels, the compression won't kick in until you have a larger chunk of level data with patterns which it could recognize.
As you know which symbols you are using (a limited set) and roughly how often they occur you could try using a Huffman encoding. As it is a symbol encoding scheme the main goal is to encode each symbol with as few bits as possible (as in morse code), you might know this already but now it's said anyway.

If you tried that you might use a Huffman encoding scheme set like:
<empty> 0
<X> 10
<H> 110
<#> 1110
<-> 11110
<G> 111110
<E> 1111110
<P> 11111110
<EndOfLevel> 11111111
And write the entire level down as a long binary string, with 11111111 terminating said string, you would end up with: (line breaks there for clarity, one line per line in your map (not the row->columns switched one.)
000111110000000000000000000000110
11011101110101110111011000000000001111100000000110
1100000011000001101010101010101010110011111000110
11001111100111111001100000110000000001101010100110
110101110101110101100000110000000001100000110
110000001101111011110111101111011011110111101111011110111100011111101100000110
110000001100000110000011010101011101110111011101110110
11000000110000011001111100011000000000110
110000111111001100111110001101010101011000000000110
1110101010111010101110101011101100000000011010101101010
11101010101110000000110000000001100011000
111011111000111000000011000111101111011110111101111011110110001100111110
101010101010101011010101011101110111000000110010101010
000000001100000000000011000000
0000000011000011111110000000011000000
101010101010101010101010101010101010101010101010101011111111
This gives us 800 bits under something pretty close to optimal symbol encoding (it would have been optimal if the encoding scheme would have been based on statistical data from your levels, which you could hard code as it will make for a higher compression in this case).
The above level could be stored in 80 bytes, but it will vary depending on the symbol frequency in each level. This data will get some additional compression from the LZW algorithm if it had a larger chunk of level data, but as you only have 400 bytes to play with I guess you are out of luck.
Anyway, it's still a nice game! Even if it only has a few levels, I guess your best bet is to optimize your code instead of level data. If you succeed in that and get more space for your level data, then your level data will hopefully be compressed better as well.