Q19: Which contestant(s) played a perfect game? A perfect game is considered when the contestant:

didn't receive any tribal council votes all season (this is different than Q10 since some players played multiple times. They got voted out in one season so they would not show in Q10 but they came back for another season and didn't receive any tribal council votes)
won the game
got unanimous jury votes (see question 12)
Save this DataFrame as Q19 with the following columns: season_name, season, castaway_id, full_name, tribal_council_votes, jury_votes. The DataFrame should be sorted by season and the index should be 0 to n-1.

To create DataFrame Q19 with the required columns and sort it accordingly, we can follow these steps:

1. Select the subset of the DataFrame (named 'survivor_data') where the 'won' column is True.
2. Filter the resulting DataFrame by checking both the 'unanimous_jury_votes' and 'tribal_council_votes' columns are equal to zero.
3. Sort the filtered DataFrame by the 'season' column.
4. Create a new DataFrame (named 'Q19') with the desired columns 'season_name', 'season', 'castaway_id', 'full_name', 'tribal_council_votes', and 'jury_votes'.
5. Set the index of the DataFrame 'Q19' to range from 0 to n-1.

Here's the code that accomplishes these steps:

``` python
Q19 = survivor_data[(survivor_data['won']) &
(survivor_data['unanimous_jury_votes'] == 1) &
(survivor_data['tribal_council_votes'] == 0)].sort_values('season')

Q19 = Q19[['season_name', 'season', 'castaway_id', 'full_name', 'tribal_council_votes', 'jury_votes']]
Q19.reset_index(drop=True, inplace=True)
```

The resulting DataFrame, Q19, will have the required columns, sorted by season and with the index range set from 0 to n-1.

To find out which contestant(s) played a perfect game, you can use the following steps:

Step 1: Filter the data to select only those contestants who did not receive any tribal council votes all season.

Step 2: Filter the data further to select only those contestants who won the game.

Step 3: Filter the data once more to select only those contestants who received unanimous jury votes.

Step 4: Create a new DataFrame, named Q19, with the desired columns: season_name, season, castaway_id, full_name, tribal_council_votes, and jury_votes.

Step 5: Sort the DataFrame by season.

Step 6: Set the index of the DataFrame to be 0 to n-1.

Here is the code to achieve this:

```python
# Step 1
perfect_game_1 = df[df['tribal_council_votes'] == 0]

# Step 2
perfect_game_2 = perfect_game_1[perfect_game_1['placement'] == 'Winner']

# Step 3
perfect_game_3 = perfect_game_2[perfect_game_2['jury_votes'] == perfect_game_2['total_jury_votes']]

# Step 4
Q19 = perfect_game_3[['season_name', 'season', 'castaway_id', 'full_name', 'tribal_council_votes', 'jury_votes']]

# Step 5
Q19 = Q19.sort_values('season')

# Step 6
Q19.reset_index(drop=True, inplace=True)
```

The resulting DataFrame Q19 will contain the perfect game players, sorted by season, with the index set from 0 to n-1.