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

调用pandas的bar()报缺少self参数 修复后DataFrame为空无绘图结果怎么解决

问题根因及解决方案

1. 初始bar() missing 1 required positional argument: 'self'报错原因

你最初的代码中df = pd.DataFrame是将pandas的DataFrame类本身赋值给了变量df,而非实例化一个DataFrame对象。后续调用df.plot.bar()时是在调用类方法,自然会要求传入实例参数self。你补充里提到加括号改成df = pd.DataFrame()完成实例化后,这个报错就会消失,这个修改是正确的。

2. 实例化后df无内容、绘图无数据的原因及修复

你当前代码还有两处核心逻辑错误导致df始终为空:

  • pd.merge()是返回新DataFrame的非原地操作,你没有用变量接收df.merge()的返回值,初始的空df从未被修改
  • 合并参数&逻辑错误:你每次生成的tmp只有单列数据,和空df执行右连接不会产生任何有效数据,同时merge参数重复传入了right=tmp,属于冗余错误

修正后的代码参考

import pandas as pd
import matplotlib.pyplot as plt
import sys

# 假设dataParse函数你已经正确实现,这里不重复编写
def createDataframe(assessments):
    # 先收集所有行数据再一次性生成df,比循环合并效率更高也更不容易出错
    rows = []
    for review in assessments:   
        for skills in review.skillList:
            for skill in skills:
                # 每一条skill生成一行数据,键是前两位,值是第三位之后的内容
                rows.append({str(skill[:2]): skill[3:]})
    # 一次性生成DataFrame,空的话也能正常识别
    df = pd.DataFrame(rows)
    return df

def plotData(df):
    # 先判断df是否为空,避免空数据报错
    if df.empty:
        print("数据为空,无法绘图")
        return
    # 确保你要指定的x轴列名存在,这里用你原来的'1.'作为示例
    if '1.' in df.columns:
        ax = df.plot.bar(x='1.')
        plt.show()
    else:
        print(f"不存在列名'1.',当前列名为:{df.columns.tolist()}")

def main():
    if len(sys.argv) > 3:
        print("Error!")
        return 1
    assessments = dataParse()
    df = createDataframe(assessments)
    # 可以加一行打印确认df内容
    print(df)
    plotData(df)

if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:57:00