You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pandas生成以Id为键的Call_loc×Time_Range元素计数矩阵字典

问题原因

你原有代码存在两个核心问题:

  • 遍历df['Id']时会重复处理同一个Id(比如Id=1在原数据中出现2次,就会循环2次,可能导致结果被重复覆盖)
  • 仅用单个Id的子数据生成交叉表,只会保留子数据里存在的Call_loc和Time_Range取值,全局维度中存在但子数据没有的项不会自动补0,因此得不到全维度的矩阵

解决代码

先提取全局所有唯一的时间范围和呼叫位置,保证每个Id的矩阵维度统一,再对每个Id的交叉表做重索引补全缺失值即可:

import pandas as pd

df = pd.DataFrame({'Id': [1,1,2,2,3,3],
                  'Call_loc': ['SJDR', 'SJDR', 'SJDR', 'TR', 'LD', 'LD'],
                  'Time_Range': [0,0,1,2,23,41]})

# 提取全局维度,保证所有Id的矩阵行列一致
all_time = sorted(df['Time_Range'].unique())
# 如果需要固定列顺序为SJDR、TR、LD,可以手动指定:all_loc = ['SJDR', 'TR', 'LD']
all_loc = sorted(df['Call_loc'].unique())

dict_matrix = {}
# 遍历唯一Id,避免重复处理
for id_val in df['Id'].unique():
    sub_df = df[df['Id'] == id_val]
    # 生成当前Id的交叉表
    cross_tb = pd.crosstab(sub_df['Time_Range'], sub_df['Call_loc'])
    # 补全所有行列,缺失值填0
    cross_tb = cross_tb.reindex(index=all_time, columns=all_loc, fill_value=0)
    dict_matrix[id_val] = cross_tb

效果验证

打印Id=1的结果:

print(dict_matrix[1])

输出符合预期:

Call_loc  LD  SJDR  TR
Time_Range            
0          0     2   0
1          0     0   0
2          0     0   0
23         0     0   0
41         0     0   0

内容的提问来源于stack exchange,提问作者Costa.Gustavo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 21:57:00