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
相关产品推荐
相关产品推荐

