任务说明
1、任务主题:论文作者统计,统计所有论文作者出现评率Top10的姓名;
2、任务内容:论文作者的统计、使用 Pandas 读取数据并使用字符串操作;
3、任务成果:学习 Pandas 的字符串操作;
1、数据读取
# 导入所需的package
import seaborn as sns #用于画图
from bs4 import BeautifulSoup #用于爬取arxiv的数据
import re #用于正则表达式,匹配字符串的模式
import requests #用于网络连接,发送网络请求,使用域名获取对应信息
import json #读取数据,我们的数据为json格式的
import pandas as pd #数据处理,数据分析
import matplotlib.pyplot as plt #画图工具
data = []
with open(r"D:\python练习/数据/arxiv-metadata-oai-snapshot.json", 'r') as f:
for idx, line in enumerate(f):
d = json.loads(line)
d = {'authors': d['authors'], 'categories': d['categories'], 'authors_parsed': d['authors_parsed']}
data.append(d)
data = pd.DataFrame(data)data = []
with open(r"D:\python练习/数据/arxiv-metadata-oai-snapshot.json", 'r') as f:
for idx, line in enumerate(f):
d = json.loads(line)
d = {'authors': d['authors'], 'categories': d['categories'], 'authors_parsed': d['authors_parsed']}
data.append(d)
data = pd.DataFrame(data)
输出结果:
知识小结:
1、enumerate()函数:enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标。
实例:
`>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1)) # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]`
2、复习json.load()函数
2、作者姓名统计
接下来我们将完成以下统计操作:
1、所有作者姓名出现频率的Top10;
2、统计所有作者姓(姓名最后一个单词)的出现频率的Top10;
3、统计所有作者姓第一个字符的评率;
为了节约计算时间,下面选择部分类别下的论文进行处理:
# 选择类别为cs.CV下面的论文
data2 = data[data['categories'].apply(lambda x: 'cs.CV' in x)]
# 拼接所有作者
all_authors = sum(data2['authors_parsed'], [])
这样输出的all_authors 是一个列表:
处理完成后all_authors变成了所有一个list,其中每个元素为一个作者的姓名。我们首先来完成姓名频率的统计。
# 拼接所有的作者
authors_names = [' '.join(x) for x in all_authors]
authors_names = pd.DataFrame(authors_names)
# 根据作者频率绘制直方图
plt.figure(figsize=(10, 6))
authors_names[0].value_counts().head(10).plot(kind='barh')
# 修改图配置
names = authors_names[0].value_counts().index.values[:10]
_ = plt.yticks(range(0, len(names)), names)
plt.ylabel('Author')
plt.xlabel('Count')
plt.show()
输出结果:
知识小结:
1、apply(lambda x: ‘cs.CV’ in x)] apply 函数:Python中apply函数的格式为:apply(func,*args,**kwargs)
当然,func可以是匿名函数。
用途:当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数,并将元组或者字典中的参数按照顺序传递给参数
DataFrame中apply的用法:
#函数应用和映射
import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon'])
print(df)
"""
b d e
utah -0.667969 1.974801 0.738890
ohio -0.896774 -0.790914 0.474183
texas 0.043476 0.890176 -0.662676
oregon 0.701109 -2.238288 -0.154442
"""
#将函数应用到由各列或行形成的一维数组上。DataFrame的apply方法可以实现此功能
f=lambda x:x.max()-x.min()
#默认情况下会以列为单位,分别对列应用函数
t1=df.apply(f)
print(t1)
t2=df.apply(f,axis=1)
print(t2)
"""
b 1.597883
d 4.213089
e 1.401566
dtype: float64
utah 2.642770
ohio 1.370957
texas 1.552852
oregon 2.939397
dtype: float64
"""
#除标量外,传递给apply的函数还可以返回由多个值组成的Series
def f(x):
return pd.Series([x.min(),x.max()],index=['min','max'])
t3=df.apply(f)
#从运行的结果可以看出,按列调用的顺序,调用函数运行的结果在右边依次追加
print(t3)
"""
b d e
min -0.896774 -2.238288 -0.662676
max 0.701109 1.974801 0.738890
"""
#元素级的python函数,将函数应用到每一个元素
#将DataFrame中的各个浮点值保留两位小数
f=lambda x: '%.2f'%x
t3=df.applymap(f)
print(t3)
"""
b d e
utah -0.67 1.97 0.74
ohio -0.90 -0.79 0.47
texas 0.04 0.89 -0.66
oregon 0.70 -2.24 -0.15
"""
#注意,之所以这里用map,是因为Series有一个元素级函数的map方法。而dataframe只有applymap。
t4=df['e'].map(f)
print(t4)
"""
utah 0.74
ohio 0.47
texas -0.66
oregon -0.15
"""
2、输出all_authors时 出现了IOPub_data_rate_limit报错
解决方法:打开anaconda prompt 输运行命令jupyter notebook --generate-config(生成配置文件jupyter_notebook_config.py路径)
修改生成的配置文件:jupyter_notebook_config.py
把默认的配置项:#c.NotebookApp.iopub_data_rate_limit = 1000000
多加好多000000改成1000000000000000000000000000000000
3、join()函数 :
语法:‘step’.join(sqe)
参数说明:
step分隔符,可以为空
sqe要连接的元素序列、元组、字符串或列表
返回值:返回一个以step为分隔符连接各个元素的字符串
# coding:utf-8
x='abc'
y='def'
z=['m1','m2','m3']
dict={'name':'lily','age':18,'city':'beijing','school':'qinghua'}
resp1=x.join(dict) # 对字典进行操作,连接是无序的
resp2=x.join(y) # 对字符串进行操作
resp3=x.join(z) #列表进行操作
print resp1
print resp2
print resp2
# 输出结果
cityabcageabcnameabcschool
dabceabcf
dabceabcf
3、authors_lastnames[0].value_counts().head(10).plot(kind=‘barh’) pandas 的value_counts()函数可以对Series里面的每个值进行计数并且排序。
现有一个DataFrame
如果我们想知道,每个区域出现了多少次,可以简单如下:
每个区域都被计数,并且默认从最高到最低做降序排列。
如果想用升序排列,可以加参数ascending=True:
如果想得出的计数占比,可以加参数normalize=True:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210116145946583.png)
3、姓的统计
接下来统计姓名姓,也就是authors_parsed字段中作者第一个单词:
`authors_lastnames = [x[0] for x in all_authors]
authors_lastnames = pd.DataFrame(authors_lastnames)
plt.figure(figsize=(10, 6))
authors_lastnames[0].value_counts().head(10).plot(kind='barh')
names = authors_lastnames[0].value_counts().index.values[:10]
_ = plt.yticks(range(0, len(names)), names)
plt.ylabel('Author')
plt.xlabel('Count')`
输出结果:
4、统计所有作者姓第一个字符
authors_lastnames_firstalpha = [x[0] for x in authors_lastnames[0]]
authors_lastnames_firstalpha = pd.DataFrame(authors_lastnames_firstalpha)
plt.figure(figsize=(10, 6))
authors_lastnames_firstalpha[0].value_counts().head(10).plot(kind='barh')
names = authors_lastnames_firstalpha[0].value_counts().index.values[:10]
_ = plt.yticks(range(0, len(names)), names)
plt.ylabel('first alpha of Author\'s lastname ')
plt.xlabel('Count')
输出结果: