Хорошо! Я решил ваш вопрос, хотя это заняло у меня некоторое время.
Первая часть такая же, как ваш прогресс.
import pandas as pd
df = pd.read_excel('test.xlsx')
df = df.fillna(method='ffill')
Затем нам нужно получить уникальные имена и количество строк, которые они охватывают. Я предполагаю, что уникальных имен столько же, сколько уникальных "usn". Я создал список, в котором хранятся эти «цифры».
unique_names = df.name.unique()
unique_usn = df.usn.unique()
counts = []
for i in range(len(unique_names)):
counts.append(df.name.str.count(unique_names[i]).sum())
counts
[3,2,2] #this means that 'dhdn' covers 3 rows, 'subbu' covers 2 rows, etc.
Теперь нам нужна умная функция, которая позволит нам получать необходимую информацию из других столбцов.
def get_items(column_number):
empty_list = []
lower_bound = 0
for i in range(len(counts)):
empty_list.append(df.iloc[lower_bound:sum(counts[:i+1]),column_number].values.tolist())
lower_bound = sum(counts[:i+1])
return empty_list
Я предоставляю вам право понять, что происходит. Но в основном мы восстанавливаем необходимую информацию. Теперь нам просто нужно применить это, чтобы получить список для подпрограмм и для отметок соответственно.
list_sub = get_items(3)
list_marks = get_items(2)
Наконец, мы объединили все это в один список.
d = []
for i in range(len(unique_names)):
diction = {}
diction['name'] = unique_names[i]
diction['usn'] = unique_usn[i]
diction['sub'] = list_sub[i]
diction['marks'] = list_marks[i]
d.append(diction)
И вуаля!
print(d)
[{'name': 'dhdn', 'usn': '1bm15mca13', 'sub': [90, 95, 98], 'marks': ['c', 'java', 'python']},
{'name': 'subbu', 'usn': '1bm15mca14', 'sub': [92, 91], 'marks': ['java', 'perl']},
{'name': 'paddu', 'usn': '1bm15mca17', 'sub': [80, 81], 'marks': ['c#', 'java']}]