Python HMM代码运行报AttributeError:无法删除属性的解决咨询
问题:马尔可夫转移网格构建函数触发AttributeError:can't delete attribute
运行构建马尔可夫转移网格的build_transition_grid函数时,执行del grid_Df.index.name代码行触发AttributeError,错误提示为‘can't delete attribute’。
相关代码
# build the markov transition grid def build_transition_grid(compressed_grid, unique_patterns): patterns = [] counts = [] for from_event in unique_patterns: # how many times for to_event in unique_patterns: pattern = from_event + ',' + to_event # MMM,MlM ids_matches = compressed_grid[compressed_grid['Event_Pattern'].str.contains(pattern)] found = 0 if len(ids_matches) > 0: Event_Pattern = '---'.join(ids_matches['Event_Pattern'].values) found = Event_Pattern.count(pattern) patterns.append(pattern) counts.append(found) # create to/from grid grid_Df = pd.DataFrame({'pairs':patterns, 'counts': counts}) grid_Df['x'], grid_Df['y'] = grid_Df['pairs'].str.split(',', 1).str grid_Df.head() grid_Df = grid_Df.pivot(index='x', columns='y', values='counts') grid_Df.columns= [col for col in grid_Df.columns] del grid_Df.index.name # replace all NaN with zeros grid_Df.fillna(0, inplace=True) grid_Df.head() #grid_Df.rowSums(transition_dataframe) grid_Df = grid_Df / grid_Df.sum(1) return (grid_Df) grid_pos = build_transition_grid(compressed_set_pos, unique_patterns) grid_neg = build_transition_grid(compressed_set_neg, unique_patterns)
错误信息
<ipython-input-33-225a1f52baba>:22: FutureWarning: Columnar iteration over characters will be deprecated in future releases. grid_Df['x'], grid_Df['y'] = grid_Df['pairs'].str.split(',', 1).str --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-33-225a1f52baba> in <module> 36 return (grid_Df) 37 ---> 38 grid_pos = build_transition_grid(compressed_set_pos, unique_patterns) 39 grid_neg = build_transition_grid(compressed_set_neg, unique_patterns) <ipython-input-33-225a1f52baba> in build_transition_grid(compressed_grid, unique_patterns) 26 27 grid_Df.columns= [col for col in grid_Df.columns] ---> 28 del grid_Df.index.name 29 30 # replace all NaN with zeros AttributeError: can't delete attribute
原因分析
Pandas中,通过pivot生成的索引,其name属性属于不可删除的类型,无法用del语句直接移除。这类属性仅支持通过赋值操作修改,而非删除。
解决方法
将del grid_Df.index.name替换为赋值None的方式清除索引名称:
grid_Df.columns= [col for col in grid_Df.columns] # 替换原del语句为以下代码 grid_Df.index.name = None
额外优化建议
- 消除
str.split的FutureWarning:
原代码中grid_Df['x'], grid_Df['y'] = grid_Df['pairs'].str.split(',', 1).str会触发版本兼容警告,建议改用expand=True参数:grid_Df[['x', 'y']] = grid_Df['pairs'].str.split(',', 1, expand=True) - 移除无用代码:
grid_Df.columns= [col for col in grid_Df.columns]这行代码未产生任何实际效果,可直接删除。
内容的提问来源于stack exchange,提问作者FMToros
相关产品推荐
相关产品推荐

