Создание словаря из данных Excel - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть данные в Excel, и мне нужно создать словарь для этих данных.

enter image description here

ожидаемый результат, как показано ниже: -

d = [
{
"name":"dhdn",
"usn":1bm15mca13",
"sub":["c","java","python"],
"marks":[90,95,98]
},
{
"name":"subbu",
"usn":1bm15mca14",
"sub":["java","perl"],
"marks":[92,91]
},
{
"name":"paddu",
"usn":1bm15mca17",
"sub":["c#","java"],
"marks":[80,81]
}
]

Пробный код, но он работает только для двух столбцов

import pandas as pd
existing_excel_file = 'BHARTI_Model-4_Migration Service parameters - Input sheet_v1.0_DRAFT_26-02-2020.xls'

df_service = pd.read_excel(existing_excel_file, sheet_name='Sheet2')

df_service = df_service.fillna(method='ffill')
result = [{'name':k,'sub':g["sub"].tolist(),"marks":g["marks"].tolist()} for k,g in df_service.groupby(['name', 'usn'])]
print (result)

Я получаю как ниже, но я хочу, как я ожидал, как и выше.

[{'name': ('dhdn', '1bm15mca13'), 'sub': ['c', 'java', 'python'], 'marks': [90, 95, 98]}, {'name': ('paddu', '1bm15mca17'), 'sub': ['c#', 'java'], 'marks': [80, 81]}, {'name': ('subbu', '1bm15mca14'), 'sub': ['java', 'perl'], 'marks': [92, 91]}]

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Наконец-то я решил.

import pandas as pd
from pprint import pprint 
existing_excel_file = 'BHARTI_Model-4_Migration Service parameters - Input sheet_v1.0_DRAFT_26-02-2020.xls'

df_service = pd.read_excel(existing_excel_file, sheet_name='Sheet2')

df_service = df_service.fillna(method='ffill')
result = [{'name':k[0],'usn':k[1],'sub':v["sub"].tolist(),"marks":v["marks"].tolist()} for k,v in df_service.groupby(['name', 'usn'])]
pprint (result)

Это дает ожидаемый результат, как я ожидал.

[{'marks': [90, 95, 98],
  'name': 'dhdn',
  'sub': ['c', 'java', 'python'],
  'usn': '1bm15mca13'},
 {'marks': [80, 81],
  'name': 'paddu',
  'sub': ['c#', 'java'],
  'usn': '1bm15mca17'},
 {'marks': [92, 91],
  'name': 'subbu',
  'sub': ['java', 'perl'],
  'usn': '1bm15mca14'}]
1 голос
/ 27 февраля 2020

Хорошо! Я решил ваш вопрос, хотя это заняло у меня некоторое время.

Первая часть такая же, как ваш прогресс.

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']}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...