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

Python3.10执行代码报错ValueError: Columns must be same length as key

问题原因分析

报错ValueError: Columns must be same length as key的核心原因是pandas版本迭代带来的str.split行为变化:

  • Python3.8对应的旧版pandas中,当str.split用正则匹配不到内容时,expand=True会返回仅1列的DataFrame,赋值给两列时会自动用NaN填充缺失列;
  • Python3.10对应的新版pandas中,严格校验拆分结果的列数和目标列数,一旦不匹配直接抛出长度错误。

另外,从CoinMarketCap新币页面爬取的Name列中,存在部分条目不含数字,导致split(r"\d+")只能拆出1列,和目标的["Name", "Symbol"]两列长度不匹配,触发报错。

解决方法

提供两种可直接落地的修复方案:

方案1:强制生成2列拆分结果(兼容所有数据)

修改拆分语句,限制拆分次数并强制补全列数,确保不管是否匹配到数字,拆分结果都是2列:

# 限制只拆分1次,确保最多生成2列,不足的列用NaN填充
split_result = df["Name"].str.split(r"\d+", expand=True, n=1).reindex(columns=[0, 1])
df[["Name", "Symbol"]] = split_result

整合后的完整可运行代码

import pandas as pd
import requests

url = "https://coinmarketcap.com/new/"
page = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=1)
usecols = ["Name", "Symbol", "1h", "24h", "MarketCap"]

df = pd.read_html(page.text)[0]
# 修复后的拆分逻辑
split_result = df["Name"].str.split(r"\d+", expand=True, n=1).reindex(columns=[0, 1])
df[["Name", "Symbol"]] = split_result

df = (df.rename(columns={"Fully Diluted Market Cap": "MarketCap"})[usecols]
          .sort_values("24h", ascending=False, key=lambda ser: ser.str.replace("%", "").astype(float))
          .replace(r"^\$", "", regex=True)
     )

df = df.head(5).to_markdown(index=True)
print(df)

方案2:过滤无数字的条目(按需选择)

如果只需要处理带数字的币种数据,可以先过滤掉Name列不含数字的行:

# 先筛选出Name列包含数字的行
df = df[df["Name"].str.contains(r"\d+")]
# 再执行拆分
df[["Name", "Symbol"]] = df["Name"].str.split(r"\d+", expand=True, n=1)

内容的提问来源于stack exchange,提问作者Drew Duazeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:35:32