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

