Try this:
df['Var6'] = df.apply(lambda x: [y for y in x.values if y != ''][:3], axis=1)
Resulting df:
Var1 Var2 Var3 Var4 Var5 Var6
1 A B C D E [A, B, C]
2 B C D [B, C, D]
3 C D E [C, D, E]
4 A C E [A, C, E]
If you want the results as comma separated string, further use:
df['Var6'] = df['Var6'].str.join(', ')
Resulting df:
Var1 Var2 Var3 Var4 Var5 Var6
1 A B C D E A, B, C
2 B C D B, C, D
3 C D E C, D, E
4 A C E A, C, E
If you want to do it in one step, use:
df['Var6'] = df.apply(lambda x: ','.join([y for y in x.values if y != ''][:3]), axis=1)
Edit
I interpreted ID in the sample data as the row index when I provided my answer, especially when OP mentioned the DataFrame is with data type as string and when she picks the first 3 elements from each row, values from column labelled ID are not picked.
However, I seen some other answer treated ID as a data column. To be complete, I would like to add codes for in case ID is a data column while its values are still NOT to be picked for the first 3 elements in each row.
In case ID is a data column but not to be picked: slightly adjust the codes as follows:
df1 = df.set_index('ID') # temporarily set column ID as index
# same code as my main answer except to replace df by df1
df1['Var6'] = df1.apply(lambda x: ','.join([y for y in x.values if y != ''][:3]), axis=1)
df = df1.reset_index() # reset the index to move ID back to data column