[英]Python - Loop though dataframe and create class objects
我有以下數據框(已經處理和清理以刪除特殊字符等)。
parent_id | members_id | item_id | 項目名 |
---|---|---|---|
par_100 | 會員1 | 項目1 | T恤 |
par_100 | 會員1 | 項目2 | 牛仔布 |
par_102 | 成員2 | 第 3 項 | 襯衫 |
par_103 | 會員3 | 第 4 項 | 短褲 |
par_103 | 會員3 | 項目5 | 女式襯衫 |
par_103 | 會員4 | 第 6 項 | 毛衣 |
par_103 | 會員4 | 第 7 項 | 連帽衫 |
並遵循類結構
class Member:
def __init__(self, id):
self.member_id = id
self.items = []
class Item:
def __init__(self, id, name):
self.item_id = id
self.name = name
數據框中的行數約為 500K+ 。 我想創建一個字典(或其他結構),其中“parent_id”是主鍵,列映射到類對象。 創建指定的數據結構后。 我將根據一些業務邏輯執行一些操作,我將不得不遍歷所有成員。
第一個動作是從數據框創建數據結構。 我有以下代碼可以完成這項工作,但處理所有 500k+ 行大約需要 3 個小時。
# sorted_data is the dataframe mentioned above
parent_key_list = sorted_data['parent_id'].unique().tolist()
for index, parent_key in enumerate(parent_key_list):
temp_data = sorted_data.loc[sorted_data['parent_id'] == parent_key]
unique_members = temp_data["members_id"].unique()
for us in unique_members:
items = temp_data.loc[temp_data['members_id'] == us]
temp_member = Member(items[0]["members_id"])
for index, row in items.iterrows():
temp_member.items.append(Item(row["item_id"], row["item_name"]))
parent_dict[parent_key].append(temp_member)
由於.loc
是非常耗時的操作,我用 numpy 數組嘗試了同樣的事情,但性能要差得多。 有沒有更好的方法來減少處理時間?
嘗試這個:
from collections import defaultdict
parent_dict = defaultdict(lambda: [])
for (parent_id, members_id), sdf in sorted_data.groupby(['parent_id', 'members_id']):
member = Member(members_id)
items = sdf.apply(lambda r: Item(r.item_id, r.item_name), axis=1).to_list()
member.items.extend(items)
parent_dict[parent_id].append(member)
它利用.groupby
函數為每個成員划分數據集。 然后,您可以在 .groupby 生成的.groupby
數據幀上使用.apply
創建項目對象,並將其轉換為列表(如果Item
對象),然后您可以使用該列表更新每個成員items
屬性。 結果成員存儲在defaultdict
中,您可以使用dict()
將其轉換回普通的(盡管它們的工作方式完全相同)。
您可以使用 iterrows 或 itertuples 來迭代數據框並初始化您的實例。 為了讓它更容易一點(如果你堅持上課,我個人會為成員和項目准備一本字典),我會做以下事情:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.