Certainly you can simplify by using:
df1['label'] = 'df1'
(rather than df1["label"] = len(df1.index) * ["df1"]
.)
If you find yourself doing this a lot, why not create your own function? (something like this):
plot_dfs(dfs):
for i, df in enumerate(dfs):
df['label'] = 'df%s' % i+1 # note: this *changes* df
melted_df = pd.concat(dfs)
# plot parameters from melted_df and colour them by df1 or df2
ggplot2.ggplot(melted_df) + ggplot2.ggplot(aes_string(..., colour="label"))
return # the melted_df or ggplot ?