Pandas中如何基于现有DataFrame按手机号唯一值批量创建DataFrame
问题场景
现有存储通话记录的DataFrame df1,数据量1万行以上,包含同一日期不同号码的通话、同一号码在不同日期的通话记录,样例数据如下:
| Date | Number |
|---|---|
| 01/01/2022 | 1234567891 |
| 01/01/2022 | 1234567892 |
| 01/02/2022 | 1234567891 |
| 01/02/2022 | 1234567893 |
| 01/02/2022 | 1234567892 |
需求为遍历df1,按Number字段的唯一手机号对行分组,为每个唯一手机号创建独立的新DataFrame。因操作需定期执行,df1的长度和内容会动态波动,排序后手动指定行范围、手动逐个提取单个号码对应数据的方式(如下方代码)无法适配动态场景:
df2= df1[df['Number'].isin([1234567891])]
需要可适配数据动态变化的自动化实现方案。
自动化实现方案
优先使用pandas原生groupby方法实现,不需要提前枚举手机号列表,自动适配数据量、号码范围的动态变化,1万行数据下性能无压力。
- 推荐方案:用字典统一管理所有分组后的DataFrame
该方式不会污染全局变量空间,方便后续批量处理、按号码取数,代码最简洁:
取指定号码的DataFrame时直接按键索引即可,比如获取1234567891的通话记录,直接调用# 分组结果存入字典:key为手机号,value为对应手机号的通话记录DataFrame number_df_map = {num: group for num, group in df1.groupby('Number', as_index=False)}number_df_map[1234567891],和手动筛选的结果完全一致。需要批量处理所有号码的数据时,直接遍历字典即可:for phone_num, call_df in number_df_map.items(): # 在此处编写单号码数据的处理逻辑,比如统计通话次数、导出csv等 print(f"号码{phone_num}通话记录数:{len(call_df)}") - 备选方案:动态生成独立命名的全局变量
如果必须生成df_xxx格式的独立变量,可通过globals()动态注册变量,不推荐日常使用,易出现变量覆盖、批量管理困难的问题:
执行完成后会自动生成所有对应号码的DataFrame变量,比如for num, group in df1.groupby('Number', as_index=False): globals()[f"df_{num}"] = groupdf_1234567891、df_1234567892,无需提前手动定义。
提示:如果
Number字段存在浮点类型、特殊字符等情况,生成字典key或变量名前建议先做格式清洗,避免出现键错误或非法变量名问题。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

