Pandas实战:将字符串列转为浮点数组并计算平均分数
解决方法:为Pandas DataFrame新增交叉验证分数均值列
问题背景
现有如下Pandas DataFrame,其中cv_scores列以字符串形式存储5折交叉验证的分数,需要新增avg_score列计算每组特征的平均分数:
import pandas as pd df = pd.DataFrame( {'feature_idx': ['(4,)','(4, 15)','(1, 4, 15)', '(1, 4, 15, 176)','(1, 4, 15, 89, 176)'], 'cv_scores': ['[0.71936929 0.75262699 0.77660679 0.85333625 0.76398875]', '[0.79227296 0.82675175 0.83723801 0.92502134 0.82625185]', '[0.82134069 0.84987581 0.86420576 0.93398567 0.84150328]', '[0.83244816 0.86689598 0.87095624 0.9445071 0.85839512]', '[0.84192526 0.87788764 0.87939774 0.95181742 0.86563099]']} )
cv_scores列的字符串格式示例:
>>> df.iloc[0]['cv_scores'] '[0.71936929 0.75262699 0.77660679 0.85333625 0.76398875]' >>> type(df.iloc[0]['cv_scores']) <class 'str'>
实现方案
方案一:使用Numpy处理字符串转数组
通过字符串清洗+Numpy数组转换来计算均值,代码简洁高效:
import numpy as np def get_avg_score(score_str): # 去除首尾方括号,按空格分割为数字字符串列表,转浮点数组 score_array = np.array(score_str.strip('[]').split(), dtype=np.float64) return score_array.mean() # 新增avg_score列 df['avg_score'] = df['cv_scores'].apply(get_avg_score)
方案二:使用AST转换为列表计算均值
先将空格分隔的字符串转换为标准列表格式,再计算均值:
import ast def get_avg_score_v2(score_str): # 替换空格为逗号,将字符串转为列表,再计算均值 score_list = ast.literal_eval(score_str.replace(' ', ',')) return sum(score_list) / len(score_list) df['avg_score'] = df['cv_scores'].apply(get_avg_score_v2)
最终结果
执行上述代码后,DataFrame将新增avg_score列,结果如下:
feature_idx cv_scores avg_score 0 (4,) [0.71936929 0.75262699 0.77660679 0.85333625 0... 0.773186 1 (4, 15) [0.79227296 0.82675175 0.83723801 0.92502134 0... 0.841507 2 (1, 4, 15) [0.82134069 0.84987581 0.86420576 0.93398567 0... 0.862182 3 (1, 4, 15, 176) [0.83244816 0.86689598 0.87095624 0.9445071 0... 0.874641 4 (1, 4, 15, 89, 176) [0.84192526 0.87788764 0.87939774 0.95181742 0... 0.883332
内容的提问来源于stack exchange,提问作者Amina Umar
相关产品推荐
相关产品推荐

