如何将Pandas DataFrame行内列表中的字符串数字转为浮点型?
如何将Pandas DataFrame列表列中的字符串元素转换为浮点型?
先看你的场景:你的exp_df里的allmz列,每行都是由字符串数字组成的列表,通过exp_df['allmz'] = exp_df['allmz'].apply(lambda x: x.split(" "))生成。你尝试了两种方法都没成功:
- 用
iteritems遍历赋值,结果原DataFrame里的元素还是字符串 - 尝试用lambda结合生成器表达式,但不确定写法是否正确
为什么之前的方法无效?
- 第一种方法里,
mzz = float(mzz)只是修改了临时变量mzz,并没有改变原列表中的元素——因为你只是取出了列表里的元素复制给mzz,修改这个副本不会影响原列表。 - 第二种方法的lambda返回的是生成器对象,而不是你需要的浮点型列表,所以无法正确替换原列的内容。
正确的解决方案
方法1:用apply+列表推导式(推荐,简洁直观)
既然allmz列已经是字符串列表了,直接用apply遍历每个列表,把每个元素转成float即可:
exp_df['allmz'] = exp_df['allmz'].apply(lambda x: [float(y) for y in x])
如果你的allmz列还没做split处理(比如原始数据是空格分隔的字符串),可以把split和转float合并:
exp_df['allmz'] = exp_df['allmz'].apply(lambda x: [float(y) for y in x.split(" ")])
方法2:原地修改列表元素(适合需要逐行自定义处理的场景)
如果你一定要用遍历的方式,需要直接修改原列表的索引位置元素(因为列表是可变对象,修改索引会直接改变原列表):
for ind, mzlist in exp_df['allmz'].iteritems(): # 遍历列表的索引,直接修改对应位置的元素 for i in range(len(mzlist)): mzlist[i] = float(mzlist[i])
验证结果
执行完上面任意一种方法后,运行以下代码验证:
print(type(exp_df.iloc[0]['allmz'][0]))
输出应该是<class 'float'>,说明转换成功。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

