Вы можете достичь второго DataFrame
с помощью groupby
df2 = df1.groupby(['id', 'revenue']).id_name.apply(list).reset_index()
id revenue id_name
0 a 65 [name_a, name_b]
1 a 70 [name_a, name_b]
2 a 121 [name_a, name_b]
Для третьего DataFrame
вы можете просто применить pandas.Series
к спискам, которые вы создали выше.Вот решение, в котором вам не нужно знать, сколько столбцов вы получите в итоге.Он будет правильно переименован до 10.
import pandas as pd
import numpy as np
df3 = pd.concat([df2[['id', 'revenue']], df2['id_name'].apply(pd.Series)], axis=1)
df3.rename(columns=dict((item, 'id_name'+str(item+1)) for item in np.arange(0,10,1)), inplace=True)
id revenue id_name1 id_name2
0 a 65 name_a name_b
1 a 70 name_a name_b
2 a 121 name_a name_b