Penso anch' io che la tabella voluta dovrebbe farsi emettere dal server; ma facciamolo pure in javascript, che potrà semmai aiutare il ragionamento per meditare un programma lato-server.
Ogni singolo film viene fornito dunque come singolo articolo, col suo genere di appartenenza (gruppo), il titolo e una descrizione; ne viene formata una tabella.

Sapendo come questa tabella di origine è strutturata, in righe e celle, possiamo farla "scansionare" da javascript che ci restituirà delle collection; nell' esempio sono le:

var gruppi = document.getElementById("origine").getElementsByTa gName("th");
var films = document.getElementById("origine").getElementsByTa gName("td");

e coi loro contenuti .innerHTML (ri-)popolare un Array (multidimensionale); e poi farla riscrivere, scorrendo l' Array ottenuto.
Nel mezzo ci sta un ciclo for con if-statement che verifica se l' innerHTML delle TH di volta in volta copiato e preso in esame, è già stato messo in qualche articolo del costruendo Array; se si trovi cioè alla posizione neworder[i][0] dove i è un numero che cambia ad ogni "colpo" del ciclo FOR.
codice:
<html>
<head><title></title>
<script type="text/javascript">

function riscrivi(){

var neworder = new Array();
var n=-1;
var f=0;
var newtab='';
var already;
var gruppi = document.getElementById("origine").getElementsByTagName("th");
var films  = document.getElementById("origine").getElementsByTagName("td");
var tds = 0;

for(g=0; g<gruppi.length; g++){

           already = false; 
    for(i=0; i<neworder.length; i++){
        if(gruppi[g].innerHTML == neworder[i][0]){
           already = true; 
           n=i;
           }; 
    };

        if(already == true){
           f=neworder[n][1].length;
           neworder[n][1][f]=films[tds].innerHTML;
           tds++;
           neworder[n][2][f]=films[tds].innerHTML;
           tds++;
     }else{
           n=neworder.length;
           f=0;
           neworder[n]=new Array();
           neworder[n][0]=gruppi[g].innerHTML;
           neworder[n][1]=new Array();
           neworder[n][1][f]=films[tds].innerHTML;
           tds++;
           neworder[n][2]=new Array();
           neworder[n][2][f]=films[tds].innerHTML;
           tds++;
           }; 

 };

for(g=0; g<neworder.length; g++){
    cells='';
    for(f=0; f<neworder[g][1].length; f++){
        cells=cells + '<tr valign="top"><td>' + neworder[g][1][f] + '</td><td>' + neworder[g][2][f] + '<\/td><\/tr>';
    };
    newtab=newtab + '<tr>' +
    '<th colspan="2" bgcolor="#DDDDFF" align="left">' + neworder[g][0] + '<\/th>' +
    '<\/tr>' + cells;
 };

document.getElementById("finale").innerHTML='<div style="border: 1px solid black;"><table border="0" bgcolor="#FFFFDD">' + newtab + '<\/table><\/div>';
 }
</script>

</head>
<body>

<table border="1"><tr valign="top">
<td>

<table id="origine"><tr>
<th colspan="2" align="left">Film d'azione</th>
</tr><tr valign="top">
<td>La Battaglia delle Ardenne</td><td>(Ambientato in Seconda Guerra Mondiale)</td>
</tr><tr>
<th colspan="2" align="left">Film d'azione</th>
</tr><tr valign="top">
<td>Io che vado a fare la spesa</td><td>('na faticaccia ...)</td>
</tr><tr>
<th colspan="2" align="left">Film d'epoca</th>
</tr><tr valign="top">
<td>La mia Prima Comunione</td><td>(Com' ero magro da bimbo !!!)</td>
</tr><tr>
<th colspan="2" align="left">Film d'azione</th>
</tr><tr valign="top">
<td>La presa della Pastiglia</td><td>(L' inizio di una Rivoluzione terapeutica)</td>
</tr><tr>
<th colspan="2" align="left">Film d'epoca</th>
</tr><tr valign="top">
<td>Ladri di tricicli</td><td>(del regista che si giocava tutto)</td>
</tr><tr>
<th colspan="2" align="left">Film comici</th>
</tr><tr valign="top">
<td>Stanlio e Ollio</td><td>(Un Classico in Bianco e Nero)</td>
</tr>
</table>

</td>
<td><input value="raggruppa" type="button" onclick="riscrivi()"></td>
<td id="finale">xxx</td>
</tr>
</table>

</body>
</html>
Se cambi l' ultima riga dello SCRIPT:
document.getElementById("finale").innerHTML='<div style=" (ecc ...)
in:
document.getElementById("origine").innerHTML='<div style=" (ecc ...)

l' azione sovrascriverà la tabella originaria,