datawhale数据分析task1(1)使用pandas读取数据并统计论文数据

统计知识点记录(datawhale数据分析task1(1))

GitHub
目标:统计2019年全年计算机各方向论文
涉及内容;pandas基础操作
数据集来源:论文数据

1 json数据类型及其读取

1.1 json数据类型含义

详细描述、与xml的对比、json在线工具 BeJson
JSON是一种和和html类似的语言, 采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

JSON建构于两种结构:

  1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
    如{ “firstName”: “Brett”, “lastName”:“McLaughlin”, “email”: “aaaa” }
  2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

JSON在python中分别由list和dict组成。

1.2 json文件的python读写模块

  • json: 用于字符串和python数据类型间进行转换,提供了四个功能:dumps、dump、loads、load
    json dumps把数据类型转换成字符串 dump把数据类型转换成字符串并存储在文件中 loads把字符串转换成数据类型 load把文件打开从字符串转换成数据类型

  • pickle:用于python特有的类型和python的数据类型间进行转换,提供了四个功能:dumps、dump、loads、load
    pickle同理

  • 区别1:json是可以在不同语言之间交换数据的,而pickle只在python之间使用。

  • 区别2: json只能序列化最基本的数据类型如(列表、字典、列表、字符串、数字、),但对于日期格式、类对象就不行了,而pickle可以序列化所有的数据类型,包括类,函数都可以序列化。

import json
test_dict = {
    
    'bigberg': [7600, {
    
    1: [['iPhone', 6300], ['Bike', 800], ['shirt', 300]]}]}
print(test_dict)
print(type(test_dict))
#dumps 将数据转换成字符串
json_str = json.dumps(test_dict)
print(json_str)
print(type(json_str))
#loads 将字符串转换成原有数据类型
new_dict = json.loads(json_str)
print(new_dict)
print(type(new_dict))

1.3 witn…as语句及open函数进行数据读取

data  = [] #初始化
#使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常
with open("arxiv-metadata-oai-snapshot.json", 'r') as f: 
    for line in f: 
        data.append(json.loads(line))
        
data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析

使用python内置的open()函数,open(‘路径+文件名’, ‘打开模式’) ,第二个参数决定了打开文件的模式:只读r,写入w,追加a等。具体参数含义如下表所示:

模式 含义
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
(r/w/a)b 以二进制的形式打开文件用于只读/写入/读写/追加/
(a/r/w/ab/wb/rb)+ 不同指针位置的读写模式
with open('/path/to/file', 'r') as f:
    print(f.read())# 调用read()会一次性读取文件的全部内容,如果数据过大,内存会承受不了,可通过f.read(size)读取size个数据
    for line in f.readlines():# 按行读取
    print(line)
 #写入数据,注意写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
 #with语句会自动调用close方法
with open('file', 'w') as f:
    f.write('Hello, world!')
    

2 split函数及列表生成器嵌套循环

2.1 split函数

unique_categories = set([i for l in [x.split(' ') for x in data["categories"]] for i in l])
len(unique_categories)
unique_categories

split() 返回列表,通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串

str.split(str="", num=string.count(str)).

  • str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
  • num – 分割次数。默认为 -1, 即分隔所有。
str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
print str.split( );       # 以空格为分隔符,包含 \n
print str.split(' ', 1 ); # 以空格为分隔符,分隔成两个

[‘Line1-abcdef’, ‘Line2-abc’, ‘Line4-abcd’]
[‘Line1-abcdef’, ‘\nLine2-abc \nLine4-abcd’]

2.2 列表生成器嵌套循环

#列表生成式:用来生成列表,在元列表的基础上生成一个新列表,可以让代码更简洁
格式:
[exp for var in iterable]
exp:表达式
var:变量
iterable:可迭代对象
执行过程:
1,先遍历可迭代对象中的元素
2,将此元素赋值给var
3,将var的值作用到exp这个表达式上
4,将表达式的结果生成一个新列表
'''
# range在python2中返回一个列表 python3中返回的是一个可迭代对象
li=[i for i in range(1,11)]  #两个变量i要一致
print(li)
l1=[1,2,3,4]
l2=[i*i for i in l1]
print(l1)
print(l2)   #[1, 2, 3, 4]
            #[1, 4, 9, 16]
l1=[1,2,3,4]
l2=[]
for i in l1:
    l2.append(i*i)
print(l1)
print(l2)
#生成一个2n+1的数字,n的取值范围是2-8
# l4=[(2*i+1)for i in range(2,9)]
l4=[2*i+1 for i in range(2,9)]
print(l4)
格式二:

[exp for var in iterable if 判断条件]

1,遍历得到每一个元素

2,将遍历得到的元素赋值给var

3,将var的值作用到if语句上

4,如果满足条件就将满足条件的值作用到exp表达式上

5,将exp表达式的运算结果追加到新的列表
#使用列表生成式

l5=list(range(1,11))

l6=[i for i in l5 if i%2==0]

print(l6)
格式三:嵌套循环
l10=["a",'b','c','d']

l11=['f','j']

l12=[]

for i in l10:
    for j in l11:
        l12.append(i+j)
print(l12)

使用列表生成式:

l10=["a",'b','c','d']

l11=['f','j']

l12=[i+j for i in l10 for j in l11]

print(l12)

[‘af’, ‘aj’, ‘bf’, ‘bj’, ‘cf’, ‘cj’, ‘df’, ‘dj’]

格式四:

有else语句时使用,注意这个判断条件都放for前面

l14=['Abc','DEF',10]

l15=[]

for i in l14:
    if isinstance(i,str):
        l15.append(i.lower())
    else:
        l15.append(i)

print(l15)

使用列表生成式,大写字母变小写,不是的不变

l14=['Abc','DEF',10]

l15=[i.lower() if isinstance(i,str) else i for i in l14 ]

print(l15)

猜你喜欢

转载自blog.csdn.net/qq_43720646/article/details/112598481