任务说明
- 任务主题:论文代码统计,统计所有论文出现代码的相关统计(本文为了简化任务,仅对含github链接的论文进行统计);
- 任务内容:使用正则表达式统计代码连接、页数和图表数据;
- 任务成果:学习正则表达式统计;
- 知识点
- 数据处理的步骤
- 正则表达式
- pandas 对数据分组处理
数据处理的步骤
- 观察数据,确定数据出现的位置
在原始arxiv数据集中作者经常会在论文的comments或abstract字段中给出具体的代码链接,所以我们需要从这些字段里面找出代码的链接。 - 使用正则表达式匹配、筛选出目标数据;
- 完成数据统计。
正则表达式1
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
普通字符:大写和小写字母、所有数字、所有标点符号和一些其他符号
字符 | 描述 |
---|---|
[ABC] | 匹配 […] 中的所有字符,例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 e o u a 字母。 |
[^ABC] | 匹配除了 […] 中字符的所有字符,例如 [^aeiou] 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字母。 |
[A-Z] | [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。 |
. | 匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]。 |
[\s\S] | 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,包括换行。 |
\w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
特殊字符:有特殊含义的字符
特别字符 | 描述 |
---|---|
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。 |
* | 匹配前面的子表达式零次或多次。要匹配 字符,请使用 \。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 [。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘’ 匹配 “”,而 ‘(’ 则匹配 “(”。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 ^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 {。 |
指明两项之间的一个选择。要匹配 |
限定符
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |
pandas对数据的处理
根据指定值筛选
- Example
# eg 1.
# data为DataFrame
data_with_code = data[
(data.comments.str.contains('github')==True)|
(data.abstract.str.contains('github')==True)
]
# eg 2
data_with_code = data_with_code[data_with_code['code_flag'] > 0]
说明:
eg 1:
data.comments
:获取comments
列的值;data.comments.str
:获得str对象 然后可以使用所有str对象的方法。- ‘|’ : 或字符
eg 2:只取code_flag 列值大于0的行
补充:pandas.str
内置的方法2:
- one hot 独热编码,get_dummies
series=data['列名'].str.get_dummies(sep=',')
:实现DataFrame中列有多值,且想把这列one hot下;- 切分字符串,split()
series=data['列名'].str.split(',')
:把DataFrame列中字符串以’,'分隔开,每个元素分开后存入一个列表里
series=data['列名'].str.split(',',expand=True)
:参数expand,这个参数取True时,会把切割出来的内容当做一列,产生多列。
series=data['列名'].str.split(',',expand=True)[0]
:可以只要第一列。- 替换,replace()
series=data['列名'].str.replace(',','-')
:用‘-’代替‘,’- 是否包含表达式,contains()
series=data['列名'].str.contains('we')
:返回的是布尔值series- 查找所有符合正则表达式的字符findall()
series=data['列名'].str.findall("[a-z]")
:以数组的形式返回- 计算字符串的长度,len()
series=data['列名'].str.len()
- 去除前后的空白字符,strip()
series=data['列名'].str.strip()
:去除前后的空白字符
rstrip()
:去除后面的空白字符
lstrip()
:去除前面的空白字符isalnum()
:是否全部是数字和字母组成
isalpha()
:是否全部是字母
isdigit()
:是否全部都是数字
isspace()
:是否空格
islower()
: 是否全部小写
isupper()
:是否全部大写
istitle()
:是否只有首字母为大写,其他字母为小写
缺失值处理
缺失值的处理方法:
- 不处理:相对少量数据缺失,或者对数据分析结果影响不大时,可以不做处理;
- 删除:根据样本大小及缺失值样本所占比例决定是否可以删除缺失值的样本;
- 特殊值填充:众数、均值、临近值、经验值填充
缺失值填充函数:fillna()
- example:
data_with_code['abstract'].fillna('')
说明:本例使用空值进行空值进行填充,也可以使用其他数值进行填充,括号内为填充值。
数据分组统计
在pandas
中使用groupby
函数进行分组,其后可以使用count()、mean()
等统计函数。
- example
# 单字段分组
data_with_code.groupby(['categories'])['code_flag'].count()
# 多字段分组
data_with_code.groupby(['categories','author'])['code_flag'].count()