簡體   English   中英

將列值分組為字典

[英]Grouping column values into a dictionary

假設我具有以下結構的數據框:

   Name   Desc   Group ConditionType ConditionName
0  job1  desc1  group1            in         cond1
1  job1  desc1  group1            in         cond2
2  job1  desc1  group1           out         cond1
3  job2  desc2  group1            in         cond1
4  job2  desc2  group1            in         cond2
5  job2  desc2  group1            in         cond3

在上下文中,它是兩個表的完整聯接。 一個帶有NameDescGroup列,另一個帶有ConditionTypeConditionName列。 這些表在“ Name ”列上聯接。

我想組織此DataFrame,以使我具有以下結構:

   Name   Desc   Group                                      Conditions
0  job1  desc1  group1    {'in': ['cond1', 'cond2'], 'out': ['cond1']}
1  job2  desc2  group1  {'in': ['cond1', 'cond2', 'cond3'], 'out': []}

我正在尋找一種更快的方法(可能使用groupby()apply() ),只是不確定從哪里開始。 因為原始表超過100000條記錄,所以For循環的速度確實很慢。

這是實例化初始表和我尋求的結果的代碼:

table = [['job1', 'desc1', 'group1', 'in', 'cond1'],
         ['job1', 'desc1', 'group1', 'in', 'cond2'],
         ['job1', 'desc1', 'group1', 'out', 'cond1'],
         ['job2', 'desc2', 'group1', 'in', 'cond1'],
         ['job2', 'desc2', 'group1', 'in', 'cond2'],
         ['job2', 'desc2', 'group1', 'in', 'cond3']]

result = [['job1', 'desc1', 'group1', {'in': ['cond1', 'cond2'], 'out': ['cond1']}],
          ['job2', 'desc2', 'group1', {'in': ['cond1', 'cond2', 'cond3'], 'out': []}]]

table_df = pd.DataFrame(table, columns=['Name', 'Desc', 'Group', 'ConditionType', 'ConditionName'])
result_df = pd.DataFrame(result, columns=['Name', 'Desc', 'Group', 'Conditions'])

會有pandas方法,但這是通過行迭代和collections.defaultdict的直觀方法。

請注意,您可能需要進行一些小調整(重置索引,添加空字典項)。

groupby方法不一定會更快。 您應該對數據進行測試。 為了提高性能,請使用df.itertuples而不是df.iterrows

from collections import defaultdict

d = defaultdict(lambda: defaultdict(list))

for idx, row in df.iterrows():
    d[(row.Name, row.Desc, row.Group)][row.ConditionType].append(row.ConditionName)

df['Conditions'] = df.set_index(['Name', 'Desc', 'Group']).index.map(d.get)

df = df.loc[:, ['Name', 'Desc', 'Group', 'Conditions']]\
       .drop_duplicates(subset=['Name', 'Desc', 'Group'])

print(df)

#    Name   Desc   Group                                    Conditions
# 0  job1  desc1  group1  {'in': ['cond1', 'cond2'], 'out': ['cond1']}
# 3  job2  desc2  group1           {'in': ['cond1', 'cond2', 'cond3']}

暫無
暫無

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

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