Pandas处理学术CSV数据时触发ValueError:EDAT轴未被识别
解决你的Pandas ValueError问题及代码优化
我一眼就发现问题出在dropna()的调用方式上了!
错误原因分析
你写的代码里:
publication_data.dropna('EDAT', inplace=True)
Pandas的dropna()函数第一个参数是axis(用来指定按行/列删除,合法值是0/1或者'index'/'columns'),你直接传'EDAT'会被当成axis参数的值,而EDAT根本不是合法的axis选项,所以触发了ValueError: No axis named EDAT for object type <class 'type'>。
正确的用法是通过subset参数来指定要检查缺失值的列名,修改这一行即可解决核心报错。
额外的代码优化点
除了这个错误,你的代码还有两处逻辑问题,会导致统计结果完全错误:
- 作者拆分逻辑错误:如果
FAU列的作者是用分隔符(比如分号、逗号)拼接的字符串,你当前的写法会把每个字符拆出来当成单独的作者,而不是拆分完整的作者名。 - 关键词拆分逻辑错误:同样,
OT列的关键词如果是拼接字符串,当前写法会把每个字符拆分,导致关键词统计混乱。
修正后的完整代码
from collections import Counter import seaborn as sns import matplotlib.pyplot as plt import pandas as pd sns.set_style("white") # Windows路径用原始字符串避免反斜杠转义问题 publication_data = pd.read_csv(r"C:\Users\jcst\Desktop\Private\Python data\My_Collection_test2.csv") # 修正dropna调用:通过subset指定要检查缺失值的列 publication_data.dropna(subset=['EDAT'], inplace=True) publication_data["Year"] = ( publication_data["EDAT"].astype(str).str[0:4].astype(int) ) plt.figure(figsize=(10, 10), dpi=600) # Top 10 authors - 修正作者拆分逻辑(假设FAU列用分号分隔,可根据实际调整) plt.subplot(2, 2, 1) authors_flat = [ author.strip() for authors in publication_data["FAU"].dropna() for author in authors.split(';') ] top10authors = pd.DataFrame.from_records( Counter(authors_flat).most_common(10), columns=["Name", "Count"] ) sns.barplot(x="Count", y="Name", data=top10authors, palette="RdBu_r") plt.title("Top 10 Authors") # Publications over Time - 增加年份排序避免折线图乱序 plt.subplot(2, 2, 2) yearly = pd.DataFrame(publication_data["Year"].value_counts().reset_index()) yearly.columns = ["Year", "Count"] yearly = yearly.sort_values("Year") sns.lineplot(x="Year", y="Count", data=yearly) plt.title("Publications over Time") plt.xlim([1986, 2020]) # TOP 10 Journals plt.subplot(2, 2, 3) top10journals = pd.DataFrame.from_records( Counter(publication_data["TA"]).most_common(10), columns=["Journal", "Count"], ) sns.barplot(x="Count", y="Journal", data=top10journals, palette="RdBu_r") plt.title("Top 10 Journals") # Top associated keywords - 修正关键词拆分逻辑(假设OT列用分号分隔) plt.subplot(2, 2, 4) flat_kw = [ kw.strip().lower() for kws in publication_data["OT"].dropna() for kw in kws.split(';') ] top10kw = pd.DataFrame.from_records( Counter(flat_kw).most_common(10), columns=["Keyword", "Count"] ) sns.barplot(x="Count", y="Keyword", data=top10kw, palette="RdBu_r") plt.title("Top 10 Associated Keywords") plt.subplots_adjust(top=1, bottom=0, left=0, right=1, hspace=0.3, wspace=0.3) plt.show()
额外说明
- 作者和关键词的分隔符请根据你CSV文件的实际格式调整(比如有的学术平台用逗号、有的用分号);
- 年度发文量部分增加了排序,避免折线图因为年份乱序导致显示异常。
内容的提问来源于stack exchange,提问作者Projectfreak
相关产品推荐
相关产品推荐

