字典列表转Dataframe时如何合并为单个Dataframe?
如何将字典列表转换为单个带重复计数的DataFrame?
我尝试将字典列表转换为单个带重复词计数的DataFrame,但目前转换后生成了多个独立的DataFrame,需要合并成一个统一的DataFrame。
数据示例
我的字典列表数据rows_data示例如下(原数据为多个子列表直接拼接的格式):
[{'case_id': 22, 'case_subject': 'followup'}, {'case_id': 22, 'case_subject': 'rma'}, {'case_id': 22, 'case_subject': 'ticket'}, {'case_id': 22, 'case_subject': '61555'}][{'case_id': 26, 'case_subject': 'c'}, {'case_id': 26, 'case_subject': 'ge'},{'case_id':26,'case_subject': 'app'}, {'case_id': 26, 'case_subject': 'logs'},{'case_id':26, 'case_subject': 'request'}][{'case_id': 30, 'case_subject': 'refund'}, {'case_id': 30, 'case_subject': 'request'}, {'case_id': 30, 'case_subject': 'return'},{'case_id': 30, 'case_subject': 'refund'}, {'case_id': 30, 'case_subject': 'pending'}, {'case_id': 30, 'case_subject': 'partial'}, {'case_id': 30, 'case_subject': 'payment'}][{'case_id': 34, 'case_subject': 'unable'}, {'case_id': 34, 'case_subject': 'control'},{'case_id': 34, 'case_subject': 'devices'}, {'case_id': 34, 'case_subject': 'via'}, {'case_id': 34, 'case_subject': 'mfg'}, {'case_id': 34, 'case_subject': 'configured'}, {'case_id': 34, 'case_subject': 'devices'}][{'case_id': 38, 'case_subject': 'trouble'}, {'case_id': 38, 'case_subject': 'connecting'}, {'case_id': 38, 'case_subject': 'alexa'}]
尝试的代码
我用来转换并生成计数的代码如下:
import pandas as pd df = pd.DataFrame(rows_data) out = df.assign(case_subject =df['case_subject'].str.split())\ .explode('case_subject').value_counts()\ .rename('Case_Subject_Split_Count').reset_index() print(out)
当前输出
执行后得到多个独立的DataFrame输出:
case_id case_subject Case_Subject_Split_Count 0 22 61555 1 1 22 followup 1 2 22 rma 1 3 22 ticket 1 case_id case_subject Case_Subject_Split_Count 0 26 app 1 1 26 c 1 2 26 ge 1 3 26 logs 1 4 26 request 1 case_id case_subject Case_Subject_Split_Count 0 30 refund 2 1 30 partial 1 2 30 payment 1 3 30 pending 1 4 30 request 1 5 30 return 1 case_id case_subject Case_Subject_Split_Count 0 34 devices 2 1 34 configured 1 2 34 control 1 3 34 mfg 1 4 34 unable 1 5 34 via 1 case_id case_subject Case_Subject_Split_Count 0 38 alexa 1 1 38 connecting 1 2 38 trouble 1
期望输出
我需要的是合并后的单个DataFrame:
case_id case_subject Case_Subject_Split_Count 22 61555 1 22 followup 1 22 rma 1 22 ticket 1 26 app 1 26 c 1 26 ge 1 26 logs 1 26 request 1 30 refund 2 30 partial 1 30 payment 1 30 pending 1 30 request 1 30 return 1 34 devices 2 34 configured 1 34 control 1 34 mfg 1 34 unable 1 34 via 1 38 alexa 1 38 connecting 1 38 trouble 1
解决方案
问题出在rows_data的格式或处理逻辑上,有两种解决方式:
方式1:合并为单一字典列表
如果rows_data是多个独立的子列表,先将它们合并成一个包含所有字典的大列表:
rows_data = [ {'case_id': 22, 'case_subject': 'followup'}, {'case_id': 22, 'case_subject': 'rma'}, {'case_id': 22, 'case_subject': 'ticket'}, {'case_id': 22, 'case_subject': '61555'}, {'case_id': 26, 'case_subject': 'c'}, {'case_id': 26, 'case_subject': 'ge'}, {'case_id':26,'case_subject': 'app'}, {'case_id': 26, 'case_subject': 'logs'}, {'case_id':26, 'case_subject': 'request'}, {'case_id': 30, 'case_subject': 'refund'}, {'case_id': 30, 'case_subject': 'request'}, {'case_id': 30, 'case_subject': 'return'}, {'case_id': 30, 'case_subject': 'refund'}, {'case_id': 30, 'case_subject': 'pending'}, {'case_id': 30, 'case_subject': 'partial'}, {'case_id': 30, 'case_subject': 'payment'}, {'case_id': 34, 'case_subject': 'unable'}, {'case_id': 34, 'case_subject': 'control'}, {'case_id': 34, 'case_subject': 'devices'}, {'case_id': 34, 'case_subject': 'via'}, {'case_id': 34, 'case_subject': 'mfg'}, {'case_id': 34, 'case_subject': 'configured'}, {'case_id': 34, 'case_subject': 'devices'}, {'case_id': 38, 'case_subject': 'trouble'}, {'case_id': 38, 'case_subject': 'connecting'}, {'case_id': 38, 'case_subject': 'alexa'} ]
之后再执行你原来的代码,就能直接生成单个合并后的DataFrame。
方式2:收集子结果后合并
如果是循环处理每个子列表导致生成多个DataFrame,可先收集所有子结果,再合并:
import pandas as pd # 假设原数据是多个子列表的集合 sub_lists = [ [{'case_id': 22, 'case_subject': 'followup'}, {'case_id': 22, 'case_subject': 'rma'}, {'case_id': 22, 'case_subject': 'ticket'}, {'case_id': 22, 'case_subject': '61555'}], [{'case_id': 26, 'case_subject': 'c'}, {'case_id': 26, 'case_subject': 'ge'},{'case_id':26,'case_subject': 'app'}, {'case_id': 26, 'case_subject': 'logs'},{'case_id':26, 'case_subject': 'request'}], [{'case_id': 30, 'case_subject': 'refund'}, {'case_id': 30, 'case_subject': 'request'}, {'case_id': 30, 'case_subject': 'return'},{'case_id': 30, 'case_subject': 'refund'}, {'case_id': 30, 'case_subject': 'pending'}, {'case_id': 30, 'case_subject': 'partial'}, {'case_id': 30, 'case_subject': 'payment'}], [{'case_id': 34, 'case_subject': 'unable'}, {'case_id': 34, 'case_subject': 'control'},{'case_id': 34, 'case_subject': 'devices'}, {'case_id': 34, 'case_subject': 'via'}, {'case_id': 34, 'case_subject': 'mfg'}, {'case_id': 34, 'case_subject': 'configured'}, {'case_id': 34, 'case_subject': 'devices'}], [{'case_id': 38, 'case_subject': 'trouble'}, {'case_id': 38, 'case_subject': 'connecting'}, {'case_id': 38, 'case_subject': 'alexa'}] ] result_dfs = [] for sub_list in sub_lists: df = pd.DataFrame(sub_list) out = df.assign(case_subject=df['case_subject'].str.split())\ .explode('case_subject').value_counts()\ .rename('Case_Subject_Split_Count').reset_index() result_dfs.append(out) # 合并所有子DataFrame,生成最终结果 final_df = pd.concat(result_dfs, ignore_index=True) print(final_df)
内容的提问来源于stack exchange,提问作者lAkShMipythonlearner
相关产品推荐
相关产品推荐

