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

给Pandas DataFrame新增列时触发ValueError:期望一维数组,却得到形状为(0, 2)的数组

解决Pandas apply新增列时的ValueError问题

看起来你遇到的ValueError: Expected a 1D array, got an array with shape (0, 2)错误,通常来自两个核心原因:要么你的DataFrame是空的,要么你的apply函数返回了非标量值。下面一步步帮你排查和解决:

第一步:检查你的DataFrame是否为空

错误里的shape (0,2)提示你的result_df是一个有0行、2列的空DataFrame。先打印确认:

print(result_df.shape)

如果输出确实是(0, 2),那问题根源在SQL查询部分:你的IN子句参数传递有误,导致查询没有返回任何数据。

修复SQL查询的参数问题

当使用IN子句时,不能直接把列表转成字符串传入cursor.execute。正确的做法是为每个关键词生成一个占位符:

# 假设str_keywords是一个字符串列表,比如["data", "analysis"]
placeholders = ', '.join(['%s'] * len(str_keywords))
query = f"""select keyword, popularity from keyword_metadata where keyword in ({placeholders})"""
cursor.execute(query, str_keywords)  # 直接传列表,不要转成字符串
result_df = pd.DataFrame(cursor.fetchall(), columns=cursor.column_names)

这样每个关键词对应一个SQL占位符,查询才能正确匹配并返回数据。

第二步:如果DataFrame非空,检查apply函数的返回值

如果result_df有数据,但还是报错,那大概率是你的函数f返回了多元素结构(比如列表、Series),而不是单个标量值。apply按行处理时,每个行的返回值必须是单个值,这样最终才能生成一个1D的Series赋值给新列。

修复函数返回值

确保函数f返回单个值,比如:

def f(x):
    print(x['keyword'], x['popularity'])
    # 示例:根据keyword和popularity计算单个得分
    return x['popularity'] * 0.8 + len(x['keyword'])  # 返回单个数值

如果你的计算逻辑需要返回多个值,那应该用apply后扩展成多列,而不是赋值给单个列。

额外建议:优先使用向量化操作代替apply

Pandas的apply虽然灵活,但效率很低。如果你的计算逻辑可以用向量化函数实现,尽量替换,比如上面的示例可以改成:

result_df['search_score'] = result_df['popularity'] * 0.8 + result_df['keyword'].str.len()

这样不仅更快,还能避免很多apply带来的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:42:47