在Pandas中按企业分组并合并cited_docdbs列表的实现
问题描述
我有一个记录专利引用关系的数据库,数据结构如下:
{'index': {0: 0, 1: 1, 2: 2, 12: 12, 21: 21}, 'docdb_family_id': {0: 57904406, 1: 57904406, 2: 57906556, 12: 57909419, 21: 57942222}, 'cited_docdbs': {0: [15057621, 16359315, 18731820, 19198211, 19198218, 19198340, 19550248, 19700609, 20418230, 22144166, 22513333, 22800966, 22925564, 23335606, 23891186, 25344297, 25345599, 25414615, 25495423, 25588955, 26530649, 27563473, 34277948, 36626718, 38801947, 40454852, 40885675, 40957530, 41249600, 41377563, 41378429, 41444278, 41797413, 42153280, 42340085, 42340086, 42678557, 42709962, 42709963, 42737942, 43648036, 44691991, 44947081, 45352855, 45815534, 46254922, 46382961, 47830116, 49676686, 49912209, 54191614], 1: [15057621, 16359315, 18731820, 19198211, 19198218, 19198340, 19550248, 19700609, 20418230, 22144166, 22513333, 22800966, 22925564, 23335606, 23891186, 25344297, 25345599, 25414615, 25495423, 25588955, 26530649, 27563473, 34277948, 36626718, 38801947, 40454852, 40885675, 40957530, 41249600, 41377563, 41378429, 41444278, 41797413, 42153280, 42340085, 42340086, 42678557, 42709962, 42709963, 42737942, 43648036, 44691991, 44947081, 45352855, 45815534, 46254922, 46382961, 47830116, 49676686, 49912209, 54191614], 2: [6078355, 8173164, 14235835, 16940834, 18152411, 18704525, 27343995, 45467248, 46172598, 49878759, 50995553, 52668238], 12: [6293366, 7856452, 16980051, 23177359, 26477802, 27453602, 41135094, 53004244, 54332594, 55018863], 21: [7913900, 13287798, 18834564, 23971781, 26904791, 27304292, 29720924, 34622252, 35197847, 37766575, 39873073, 42075013, 44508652, 44530218, 45571357, 48222848, 48747089, 49111776, 49754218, 50024241, 50474222, 50545849, 52580625, 58800268]}, 'doc_std_name': {0: 'SEEO INC', 1: 'BOSCH GMBH ROBERT', 2: 'SAMSUNG SDI CO LTD', 12: 'NAGAI TAKAYUKI', 21: 'SAMSUNG SDI CO LTD'}}
我目前用以下代码按企业(doc_std_name)分组:
df_grouped_byfirm=data_min.groupby("doc_std_name").agg(publn_nrs=('docdb_family_id',"unique")).reset_index()
现在需要把同一企业对应的所有cited_docdbs列表合并成一个大列表,比如示例中SAMSUNG SDI CO LTD的两个条目对应的cited_docdbs要合并成:
[6078355, 8173164, 14235835, 16940834, 18152411, 18704525, 27343995, 45467248, 46172598, 49878759, 50995553, 52668238, 7913900, 13287798, 18834564, 23971781, 26904791, 27304292, 29720924, 34622252, 35197847, 37766575, 39873073, 42075013, 44508652, 44530218, 45571357, 48222848, 48747089, 49111776, 49754218, 50024241, 50474222, 50545849, 52580625, 58800268]
请问怎么实现这个需求?
解决方案
可以通过自定义聚合函数或Pandas内置方法组合实现,以下是几种实用方案:
方法一:自定义合并列表函数
直接在agg方法中为cited_docdbs列指定合并逻辑:
def merge_cited_lists(lists): merged = [] for sublist in lists: merged.extend(sublist) return merged # 同时处理两个列的聚合 df_grouped_byfirm = data_min.groupby("doc_std_name").agg( publn_nrs=('docdb_family_id', "unique"), merged_cited_docdbs=('cited_docdbs', merge_cited_lists) ).reset_index()
方法二:用explode简化聚合
利用explode展开列表元素后再重新聚合,代码更简洁:
df_grouped_byfirm = data_min.groupby("doc_std_name").agg( publn_nrs=('docdb_family_id', "unique"), merged_cited_docdbs=('cited_docdbs', lambda x: x.explode().tolist()) ).reset_index()
方法三:合并后去重(可选)
如果需要移除重复的引用ID,可在聚合函数中加入去重逻辑:
def merge_unique_cited_lists(lists): merged = [] for sublist in lists: merged.extend(sublist) # 去重并保留原顺序(Python 3.7+字典默认有序) return list(dict.fromkeys(merged)) df_grouped_byfirm = data_min.groupby("doc_std_name").agg( publn_nrs=('docdb_family_id', "unique"), merged_cited_docdbs=('cited_docdbs', merge_unique_cited_lists) ).reset_index()
内容的提问来源于stack exchange,提问作者Lusian
相关产品推荐
相关产品推荐

