3 回答

TA貢獻1844條經驗 獲得超8個贊
您可以像這樣使用熊貓:
import pandas as pd
df = pd.DataFrame([{'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Phone', 'cost': 325}, {'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Flower', 'cost': 195}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Paris Trip', 'cost': 599}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Ring', 'cost': 1200}])
df = df.groupby('budget_id').agg({'name': set,
'amount': set,
'cost': set ,
'user': set,
'gift': set}).reset_index()
print(df.to_dict('records'))

TA貢獻1886條經驗 獲得超2個贊
該解決方案不會對數組的任何元素進行硬編碼,但是由于您對不同的鍵有不同的要求,因此需要對這些鍵進行硬編碼才能正確處理它們。在合并后的示例中,您只有 ['Maria'],而如果您有兩個成本相同的項目,您肯定會期望成本為 [150, 150],而不是 [150]。
final = {} # key is budget_id, and value is the all dictionaries merged
for dict in list:
budget_id = dict['budget_id']
if budget_id in final:
# for each key you'll do something like this
dictToModify = final[budget_id]
dictToModify.append(dict['gift'])
# for each key in dictionary, add it to the list
# some will be added always to the list: e.g. cost
# some will be added only once, e.g. name and budget_id
else:
# here you're just putting everything in a list as in your final_data example
final[ budget_id ] = {key:[value] for (key,value) in dict.items()}
final_data = list(final.values())
如果元素不存在,則此循環將元素添加到最終字典,或者如果已存在具有相同 budget_id 的元素,則合并。循環的最后一步是將其轉換為字典列表。

TA貢獻1827條經驗 獲得超8個贊
這是一個解決方案,raw_data為了更好地演示而進行了擴展:
raw_data = [{'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Phone', 'cost': 325}, {'budget_id': 1, 'name': 'Maria', 'amount': 980, 'user': '10', 'gift': 'Flower', 'cost': 195}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Paris Trip', 'cost': 599}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Ring', 'cost': 1200}, {'budget_id': 2, 'name': 'Scott', 'amount': 2100, 'user': '10', 'gift': 'Watch', 'cost': 240}]
final_data = []
for entry in raw_data:
found = False
for ind, final in enumerate(final_data):
# Look if the budget entry already exists
if entry['budget_id'] in final['budget_id']:
found = True
break
if found:
# Merge
# Everything - issue if any entry just happens
# to be the same (like cost)
#for key, value in entry.items():
#if not (entry[key] in final[key]):
# final_data[ind][key].append(entry[key])
# Alternative - specific entries only
final_data[ind]['gift'].append(entry['gift'])
final_data[ind]['cost'].append(entry['cost'])
else:
# If not yet there - add it as a new item, converting
# all values to lists
final_data.append({x:[y] for x,y in entry.items()})
print(final_data)
代碼循環遍歷raw_data循環中的所有字典。對于每個字典,它然后循環遍歷所有現有條目以final_data跟蹤索引enumerate。使用budget_id它檢查是否已經遇到并存儲了預算條目。如果是這種情況,它會設置一個適當的標志并中斷循環。
在第二部分,如果尚未遇到該條目,則將其final_data作為字典附加到列表中,并將其所有值轉換為列表。
如果它已經存在 - 數據被合并。這里有兩個選項,一個,注釋掉的一個,如果值不相同/不存在,它將所有內容合并在一起。這對于很容易重復的商品價格之類的東西不利,但為了完整起見,我保留了它。
在第二個當前版本中,它只是查找特定的項目鍵并與它們合并。這假定即使 中有重復項gifts,也應該包括它們。
添加回答
舉報