如何实现Pandas列内列表元素的视图值求和统计算法
问题描述与解决方案
首先导入pandas库:
import pandas as pd
创建示例问题的DataFrame:
data = [[['A','B','C','D','E'],1000], [['C','B'],2000], [['X','Y','Z'],3000]] df = pd.DataFrame(data=data, columns=['token','view'])
该DataFrame的结构如下:
In[0]:df Out[0]: token view 0 [A, B, C, D, E] 1000 1 [C, B] 2000 2 [X, Y, Z] 3000
核心需求:统计df['token']列中每个唯一列表元素对应的view值总和。例如元素"B"出现在两行,对应view值1000和2000,需得到总和3000。现有统计代码无法正确获取当前行的view值,得到的是Series类型结果,统计错误,需修正。
步骤1:提取所有token元素并去重
lst = [] for item in df['token']: for it in item: lst.append(it) set_token = set(lst) unique_token = list(set_token)
去重后的结果:
In[1]:unique_token Out[1]: ['D', 'E', 'Z', 'B', 'A', 'Y', 'C', 'X']
步骤2:初始化存储统计结果的字典
dict_token = {} for item in unique_token: dict_token[item] = 0
初始化后的字典:
In[2]:dict_token Out[2]: {'D': 0, 'E': 0, 'Z': 0, 'B': 0, 'A': 0, 'Y': 0, 'C': 0, 'X': 0}
错误的统计代码及问题
for item in dict_token.keys(): for it in df['token']: if item in it: dict_token[item] += df['view']
错误执行结果:
In[3]:dict_token Out[3]: {'D': 0 2000 1 4000 2 6000 Name: view, dtype: int64, 'E': 0 2000 1 4000 2 6000 Name: view, dtype: int64, 'Z': 0 2000 1 4000 2 6000 Name: view, dtype: int64, 'B': 0 4000 1 8000 2 12000 Name: view, dtype: int64, 'A': 0 2000 1 4000 2 6000 Name: view, dtype: int64, 'Y': 0 2000 1 4000 2 6000 Name: view, dtype: int64, 'C': 0 4000 1 8000 2 12000 Name: view, dtype: int64, 'X': 0 2000 1 4000 2 6000 Name: view, dtype: int64}
问题根源:错误代码中直接累加整个df['view'] Series,而非当前行对应的单个view数值。
修正方案
方案一:修正原遍历逻辑
遍历DataFrame的每一行,同时获取当前行的token列表和对应的view值,逐个累加:
for idx, row in df.iterrows(): tokens = row['token'] view_val = row['view'] for token in tokens: dict_token[token] += view_val
执行后得到期望结果:
Out[3]:{'D': 1000, 'E': 1000, 'Z': 3000, 'B': 3000, 'A': 1000, 'Y': 3000, 'C': 3000, 'X': 3000}
方案二:pandas原生简洁方法
使用explode展开token列表,再按token分组求和,最后转为字典:
result = df.explode('token').groupby('token')['view'].sum().to_dict()
执行结果同样符合预期:
{'A': 1000, 'B': 3000, 'C': 3000, 'D': 1000, 'E': 1000, 'X': 3000, 'Y': 3000, 'Z': 3000}
内容的提问来源于stack exchange,提问作者Platothecynic
相关产品推荐
相关产品推荐

