如何使用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
相关产品推荐
相关产品推荐

