Another way to do this is as follows:
We have first dataframe:
data1 = [[1, 'Male'], [2, 'Female'], [3, 'Female']]
df1 = pd.DataFrame(data1, columns=['ID', 'Gender'])
# Output
ID Gender
1 Male
2 Female
3 Female
And the second dataframe:
data2 = [[1, 30], [2, 27], [2, 22]]
df2 = pd.DataFrame(data2, columns=['ID', 'Vote'])
# Output
ID Vote
1 30
2 27
2 22
We first merge:
merged_df = df1.merge(df2, on='ID', how='outer')
#Output:
ID Gender Vote
0 1 Male 30.0
1 2 Female 27.0
2 2 Female 22.0
3 3 Female NaN
Assuming that df1 have all unique rows, you can create your required dataframe as follows:
final_df_list = []
for id in merged_df.ID.unique():
prefix = 'Vote'
suffix = 1
current_df = merged_df.loc[merged_df.ID == id]
gender = merged_df.loc[merged_df.ID == id]['Gender'].values[0]
data = [[id, gender]]
columns = ['ID', 'Gender']
for vote in current_df.Vote.values:
data[0].append(vote)
columns.append(f'{prefix}{suffix}')
suffix += 1
final_df_list.append(pd.DataFrame(data=data, columns=columns))
output_df = pd.concat(final_df_list, sort = False)
# output_df:
ID Gender Vote1 Vote2
0 1 Male 30.0 NaN
0 2 Female 27.0 22.0
0 3 Female NaN NaN