First of all: You don't want to append/concatenate df3 to the other two because it's an entirely different table. You would concatenate Dataframes containing the same kind of data, i.e. the same columns. If df3 is missing a column df2 has, this column would be empty for all values originating from df3. This is what happened when you concatenated df3 to the other two. The result shows you what I try to say with my first sentence: They share no columns and are two completely separate tables.
Another thing that might help you to get along with pandas is: Pandas is preferably used on stacked data (I don't know if it's officially called stacked but I'll call it like this for now) while your df1 and df2 are pivot tables:
Pivot table:
| Country/Sex | male | female |
|-------------|------|--------|
| India | 10 | 20 |
| China | 30 | 40 |
| USA | 50 | 60 |
Stacked table (preferably use this with pandas):
| Country | sex | number |
|---------|--------|--------|
| India | male | 10 |
| India | female | 20 |
| China | male | 30 |
| China | female | 40 |
| USA | male | 50 |
| USA | female | 60 |
You can switch between these two using pd.pivot() and pd.unstack() as decribed here. It may also help with the problem that Training: 1 and Validation: 1 are interpreted as columns when they're probably just the names of the tables. In a stacked table you could just add another column specifying each row as either Training or Validation.
Your df3 is already stacked, df1 and df2 are pivot tables.