Как создать вложенный список динамически внутри цикла для цикла и рекурсивно добавить его к конечному набору результатовPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как создать вложенный список динамически внутри цикла для цикла и рекурсивно добавить его к конечному набору результатов

Сообщение Anonymous »

У меня есть следующий скрипт Python, который я хотел бы изменить, чтобы создать новую вложенную для цикла внутри j in i ["attributes"] цикл для динамического извлечения для каждого клиента

Код: Выделить всё

Company_ID
, fancom_id и checipt_no ):

Код: Выделить всё

import pandas as pd

df = pd.DataFrame({
'type': ['customer','customer','customer','customer'],
'customer_id': ['1-0000001','1-0000001','1-0000002','1-0000002'],
'u_fn': ['TestUser1_FirstName','TestUser1_FirstName','TestUser2_FirstName','TestUser2_FirstName'],
'u_ln': ['TestUser1_LastName','TestUser1_LastName','TestUser2_LastName','TestUser2_LastName'],
'Customer_Type_ID': ['ΦΥΣΙΚΟ','ΦΥΣΙΚΟ','ΦΥΣΙΚΟ','ΦΥΣΙΚΟ'],
'u_em': ['[email protected]','[email protected]','[email protected]','[email protected]'],
'u_mb': ['6900000001','6900000001','6900000002','6900000002'],
'# of policies':[2,2,2,2],
'Company_ID': [2,2,2,2],
'Branch_ID': [5,5,5,5],
'Policy_No': ['000000001','000000001','000000002','000000002'],
'Receipt_No': ['420000001','420000002','430000001','430000002']
})

grouped = df.groupby('customer_id').apply(lambda x: x[['u_fn', 'u_ln', 'Customer_Type_ID', 'u_em','u_mb',
'Company_ID', 'Branch_ID', 'Policy_No',
'Receipt_No', '# of policies']].to_dict('records'), include_groups=False).reset_index()

grouped.columns = ['customer_id', 'attributes']  # Column names for grouped DataFrame

output = grouped.to_dict('records')

results = []

for i in output:

attributes = {}
for j in i["attributes"]:
attributes["u_fn"] = j["u_fn"]
attributes["u_ln"] = j["u_ln"]
attributes["Customer_Type_ID"] = j["Customer_Type_ID"]
attributes["u_em"] = j["u_em"]
attributes["u_mb"] = j["u_mb"]
attributes["# of policies"] = j["# of policies"]
attributes["Company_ID"] = j["Company_ID"]
attributes["Branch_ID"] = j["Branch_ID"]
attributes["Policy_No"] = j["Policy_No"]
attributes["Receipt_No"] = j["Receipt_No"]

contact = {
"Id": i["customer_id"],
"attributes": attributes
}
results.append(contact)
< /code>
Запуск этого скрипта значение списка «результатов»-следующее: < /p>
[{
'Id': '1-0000001',
'attributes': {
'u_fn': 'TestUser1_FirstName',
'u_ln': 'TestUser1_LastName',
'Customer_Type_ID': 'ΦΥΣΙΚΟ',
'u_em': '[email protected]',
'u_mb': '6900000001',
'# of policies': 2,
'Company_ID': 2,
'Branch_ID': 5,
'Policy_No': '000000001',
'Receipt_No': '420000002'
}
}, {
'Id': '1-0000002',
'attributes': {
'u_fn': 'TestUser2_FirstName',
'u_ln': 'TestUser2_LastName',
'Customer_Type_ID': 'ΦΥΣΙΚΟ',
'u_em': '[email protected]',
'u_mb': '6900000002',
'# of policies': 2,
'Company_ID': 2,
'Branch_ID': 5,
'Policy_No': '000000002',
'Receipt_No': '430000002'
}
}
]
Как вы можете видеть, каждая политика_no имеет только последнее значение receipt_no, потому что во время итерации первые полученные значения ( 420000001 и 430000001 ) перезаписаны вторыми ( 4200002 и 4300002 ). Новый список под названием « details Details 'должен быть создан, и он должен содержать для каждого идентификатора, все политики_no с помощью reffice_no .

Код: Выделить всё

[{
'Id': '1-0000001',
'attributes': {
'u_fn': 'TestUser1_FirstName',
'u_ln': 'TestUser1_LastName',
'Customer_Type_ID': 'ΦΥΣΙΚΟ',
'u_em': '[email protected]',
'u_mb': '6900000001',
'# of policies': 2,
'policies details': [{
'Company_ID': 2,
'Branch_ID': 5,
'Policy_No': '000000001',
'Receipt_No': '420000001'
}, {
'Company_ID': 2,
'Branch_ID': 5,
'Policy_No': '000000001',
'Receipt_No': '420000002'
}
]
}
}, {
'Id': '1-0000002',
'attributes': {
'u_fn': 'TestUser2_FirstName',
'u_ln': 'TestUser2_LastName',
'Customer_Type_ID': 'ΦΥΣΙΚΟ',
'u_em': '[email protected]',
'u_mb': '6900000002',
'# of policies': 2,
'policies details': [{
'Company_ID': 2,
'Branch_ID': 5,
'Policy_No': '000000002',
'Receipt_No': '430000001'
}, {
'Company_ID': 2,
'Branch_ID': 5,
'Policy_No': '000000002',
'Receipt_No': '430000002'
}
]
}
}
]
для достижения этого результата, начиная с начальной кадры данных, я выполнил следующие шаги:
  • Я добавил новый столбец (список словарей), называемый политика i ["police_no"]

Код: Выделить всё

df['policies details'] = df[['Company_ID', 'Branch_ID', 'Policy_No', 'Receipt_No']].to_dict(orient='records')

grouped = df.groupby('customer_id').apply(lambda x: x.groupby('Policy_No').apply(lambda y: y.drop(['customer_id', 'Policy_No'], axis=1).to_dict(orient='records'))).reset_index()

grouped.columns = ['customer_id', 'Policy_No', 'attributes']  # Column names for grouped DataFrame

output = grouped.to_dict('records')

results = []

for i in output:
attributes = {}
for j in i["attributes"]:
attributes["u_fn"] = j["u_fn"]
attributes["u_ln"] = j["u_ln"]
attributes["Customer_Type_ID"] = j["Customer_Type_ID"]
attributes["u_em"] = j["u_em"]
attributes["u_mb"] = j["u_mb"]
attributes["# of policies"] = j["# of policies"]
policies_details = []
for k in i["Policy_No"]:
attributes["policies details"] = j["policies details"]

contact = {
"Id": i["customer_id"],
"attributes": attributes
}
results.append(contact)
< /code>
Но опять же, значение результатов не было правильным. Я перезаписал первые значения receipt_no 
со вторыми. Моя главная проблема заключается в том, что я не знаю, как правильно итерации внутри существующего для j in i ["attributes"] и как добавить каждое значение, не перезаписывая его.
Любая помощь будет высоко ценится.


Подробнее здесь: https://stackoverflow.com/questions/795 ... t-recursiv
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»