基于唯一PIN拆分DataFrame并统计各LID的结果数量
基于唯一PIN拆分DataFrame并统计各LID的结果数量
嘿,我来帮你搞定这个需求!其实用pandas的分组功能就能轻松解决,不用你手动去遍历唯一PIN列表~ 咱们一步步来:
首先,先明确你的两个核心需求:一是给每个唯一PIN生成单独的DataFrame,二是统计每个PIN下各LID对应的结果条数。pandas的groupby函数刚好能同时满足这两个需求,而且针对几千行的数据效率也很高。
第一步:先统计各PIN下每个LID的结果数量
我们可以先对PIN和LID做分组,然后统计每个组里Results列的行数,这样就能得到每个LID对应的结果数量:
import pandas as pd import numpy as np # 你的示例数据 d = { 'PIN': [445588,445588,445588,668989,668989,212121], 'LID': [124, 124, 125, 625, 625, 325], "Results": [8,5,3,23,11,45] } df = pd.DataFrame(data=d) # 统计每个PIN-LID组合的结果数量,结果存到新列Result_Count里 count_summary = df.groupby(['PIN', 'LID'])['Results'].count().reset_index(name='Result_Count') print("各PIN-LID的结果数量统计:") print(count_summary)
运行这段代码后,你会得到一个汇总表,里面清晰显示每个PIN下每个LID有多少条结果。
第二步:按唯一PIN拆分DataFrame并合并统计数据
接下来我们可以直接按PIN分组,把每个分组存到一个字典里(用PIN值当键,这样后续调用非常方便),同时把刚才的统计结果合并到每个拆分后的DataFrame中:
# 用字典存储每个PIN对应的DataFrame,方便后续调用 pin_dataframes = {} # 遍历按PIN分组后的结果 for pin_value, group_df in df.groupby('PIN'): # 把当前PIN对应的统计结果合并到原始分组数据中 merged_group = group_df.merge(count_summary[count_summary['PIN'] == pin_value], on=['PIN', 'LID'], how='left') # 存入字典 pin_dataframes[pin_value] = merged_group # 示例:查看PIN为445588的DataFrame print("\nPIN为445588的完整数据(含LID结果计数):") print(pin_dataframes[445588])
运行后你会看到,每个拆分后的DataFrame里都多了一列Result_Count,显示当前行对应的LID有多少条结果。比如PIN445588的LID124对应的Result_Count是2,因为它有两个结果值。
额外小提示
如果你只想获取每个PIN的统计汇总表(不需要原始Results数据),可以直接对统计后的count_summary做分组拆分:
pin_count_dfs = {} for pin_value, group_df in count_summary.groupby('PIN'): pin_count_dfs[pin_value] = group_df # 查看PIN为668989的统计汇总 print("\nPIN为668989的统计汇总:") print(pin_count_dfs[668989])
为什么不推荐你原来的手动遍历唯一列表的方式?因为pandas的groupby是底层优化过的,比手动转列表再搜索要高效得多,尤其是数据量上千行的时候,速度差异会很明显,而且代码也更简洁易读。
备注:内容来源于stack exchange,提问作者Sofie
相关产品推荐
相关产品推荐

