我有這兩個 DictReader-ed csv 檔案:
A = {"Name": "Alex", "Age": 17} {"Name": "Bob", "Age": 20"} {"Name": "Clark", "Age": 24"}
B = {"Age": 17, "Class": "Economy"} {"Age": 24, "Class": "IT"} {"Age":17, "Class": Arts}
和幾個括號中的值。
是否有可能加入他們來形成這個:
{"Name": "Alex", "Age": 17, "Class": [{"Economy"}, {"Arts"}]}
{"Name": "Clark", "Age": 24, "Class": [{"IT"}]}
簡而言之,當他們擁有Age相同的課程并將所有相同的課程放入串列時加入他們?
到目前為止,我只閱讀了兩個字典:
import csv
A=open('A.csv')
A_reader = csv.DictReader(A)
B=open('B.csv')
B_reader = csv.DictReader(B)
for item in A_reader:
print(item)
for item in B_reader:
print(item)
但不確定如何如前所述合并它們。
謝謝!
編輯:給出的 csv 是為了沒有兩個人的年齡相同。
uj5u.com熱心網友回復:
import copy
A = [{"Name": "Alex", "Age": 17}, {"Name": "Bob", "Age": 20}, {"Name": "Clark", "Age": 24}]
B = [{"Age": 17, "Class": "Economy"}, {"Age": 24, "Class": "IT"}, {"Age":17, "Class": "Arts"}]
C = []
for a in A:
c = copy.copy(a)
c["Class"] = []
for b in B:
if a["Age"]==b["Age"]:
c["Class"].append(b["Class"])
C.append(c)
結果是:
[{'Name': 'Alex', 'Age': 17, 'Class': ['Economy', 'Arts']},
{'Name': 'Bob', 'Age': 20, 'Class': []},
{'Name': 'Clark', 'Age': 24, 'Class': ['IT']}]
如果它不適合你,請告訴我:)
uj5u.com熱心網友回復:
我會先B變成一個字典{age: [classes]},然后回圈A并組合字典——你擁有的資料越多,B與一遍又一遍地回圈相比,它的效率就越高。我會用一個collections.defaultdict。1
from collections import defaultdict
# {17: ['Economy', 'Arts'], 24: ['IT']}
classes_by_age = defaultdict(list)
for b in B:
classes_by_age[b['Age']].append(b['Class'])
有了這些,您需要做的就是合并字典。我想最簡潔的方法之一是將雙星號運算子**和關鍵字引數的組合傳遞給dict建構式:
merged = [dict(**a, Classes=classes_by_age[a['Age']]) for a in A]
1如果不想匯入defaultdict,可以簡單初始化classes_by_age為一個空字典并在回圈中執行:
for b in B:
age = b['Age']
class_ = b['Class']
if age in classes_by_age:
classes_by_age[age].append(class_)
else:
classes_by_age[age] = [class_]
但是你也必須采用下面的最終串列理解,否則空Classes會導致麻煩:
[dict(**a, Classes=classes_by_age.get(a['Age'], [])) for a in A]
uj5u.com熱心網友回復:
你在評論中提到了熊貓。如果這是一個選項,那么您可以嘗試:
import pandas as pd
df_A = pd.read_csv("A.csv")
df_B = pd.read_csv("B.csv")
result = df_A.merge(
df_B.groupby("Age")["Class"].agg(list), on="Age", how="left"
).to_dict("records")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/471448.html
