簡體   English   中英

Python - 循環數據框並創建類對象

[英]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 來迭代數據框並初始化您的實例。 為了讓它更容易一點(如果你堅持上課,我個人會為成員和項目准備一本字典),我會做以下事情:

  • 將成員 id 屬性添加到項目
  • 迭代數據框並僅初始化項目實例
  • 之后,您可以檢查所有項目實例,以便識別唯一成員及其項目

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM