Pandas技术问题:如何从DataFrame行内列表提取指定值
问题解决指南
1. 修复ValueError: Length of values does not match length of index错误
你遇到的这个错误,核心问题是你错误地提取了整个Series的第一个元素,而非每个单元格内列表/字符串的第一个元素。
你当前代码里的energy["Country"] = energy["Country"].str.split("(")[0],str.split("(")会返回一个Series——其中每个元素是分割后的列表(比如["Bolivia ", "Plurinational State of)"])。但你直接加[0]是取这个Series的第一行列表,不是每行内列表的第一个元素,这就导致赋值的长度和原DataFrame行数不匹配,触发了ValueError。
根据你的数据实际类型,有两种正确写法:
情况A:Country列元素是字符串(如"Bolivia (Plurinational State of)")
用str.split()结合str[0]提取每个字符串分割后的第一部分,再用str.strip()去掉多余空格:
energy["Country"] = energy["Country"].str.split("(").str[0].str.strip()
情况B:Country列元素是列表(如["Bolivia ", "Plurinational State of)"])
如果单元格确实是列表类型,用apply提取每个列表的第一个元素,同时处理空值:
energy["Country"] = energy["Country"].apply(lambda x: x[0].strip() if isinstance(x, list) and len(x) > 0 else x)
2. 让科学计数法数值以常规形式显示
要让1.430000e+08这类数值显示为常规整数(比如143000000),有两种常用方法:
方法1:全局设置pandas显示格式
通过设置pandas显示选项,让所有浮点型数值按常规格式显示(这里设为整数格式,因为你的Energy Supply是乘以1e6后的整数):
pd.set_option('display.float_format', lambda x: '{:.0f}'.format(x) if pd.notnull(x) else x)
这个设置会影响整个pandas的显示,所有符合条件的浮点数列都会按整数显示。
方法2:将列转换为整数类型
如果Energy Supply列没有缺失值(或已处理NaN),可以直接转成整数类型:
# 先填充NaN,再转换 energy["Energy Supply"] = energy["Energy Supply"].fillna(0).astype(int)
如果需要保留NaN,用支持空值的整数类型Int64:
energy["Energy Supply"] = energy["Energy Supply"].astype('Int64')
完整修正后的代码示例
把修复逻辑整合到你的函数中:
import numpy as np import pandas as pd def answer_one(): # 设置显示格式,避免科学计数法 pd.set_option('display.float_format', lambda x: '{:.0f}'.format(x) if pd.notnull(x) else x) energy = pd.read_excel('Energy Indicators.xls', sheet_name='Energy', skiprows=list(range(10,18)), skipfooter=38, usecols=[2,3,4,5], na_values = "...") energy.columns = ['Country', 'Energy Supply', 'Energy Supply per Capita', '% Renewable'] energy["Energy Supply"] = energy["Energy Supply"].mul(1000000) # 修复Country列的提取逻辑 energy["Country"] = energy["Country"].str.split("(").str[0].str.strip() return energy answer_one()
内容的提问来源于stack exchange,提问作者CuriousLearner
相关产品推荐
相关产品推荐

