You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:32:42