我有以下資料框(已經處理和清理以洗掉特殊字符等)。
| 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 陣列嘗試了同樣的事情,但性能要差得多。有沒有更好的方法來減少處理時間?
uj5u.com熱心網友回復:
嘗試這個:
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函式為每個成員劃分資料集。然后,您可以使用.apply生成的子資料框創建專案物件.groupby,并將其轉換為串列,如果Item您可以使用這些物件來更新每個成員items屬性。結果成員存盤在一個defaultdict您可以使用它轉換回普通成員的位置dict()(盡管它們的作業方式完全相同)。
uj5u.com熱心網友回復:
您可以使用 iterrows 或 itertuples 來迭代資料框并初始化您的實體。為了讓它更容易一點(如果你堅持上課,我個人會為成員和專案準備一本字典),我會做以下事情:
- 將成員 id 屬性添加到專案
- 迭代資料框并僅初始化專案實體
- 之后,您可以檢查所有專案實體,以便識別唯一成員及其專案
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485063.html
上一篇:附加不同大小的python陣列
