パンダを使用してデータを読み取り、紙のデータを数えます
統計知識ポイント記録(データクジラデータ分析タスク1(1))
GitHubの
目標:2019年にコンピューターでさまざまな方向
の紙の内容をカウントする;パンダの基本操作
データセットソース:紙のデータ
1つのjsonデータ型とその読み取り
1.1jsonデータ型の意味
詳細な説明、xmlとの比較、jsonオンラインツールBeJson
JSONは、htmlに似た言語であり、言語に完全に依存しないテキスト形式を使用しますが、C言語ファミリー(C、C ++、Java、JavaScript、Perlを含む)と同様の習慣も使用します。 、Pythonなど)。これらの機能により、JSONは理想的なデータ交換言語になります。読み取りと書き込みは簡単ですが、マシンの解析と生成も簡単です(通常はネットワークの伝送速度を向上させるために使用されます)。
JSONは2つの構造で構成されています。
- 名前と値のペアのコレクション。さまざまな言語では、オブジェクト(オブジェクト)、レコード(レコード)、構造(構造)、辞書(辞書)、ハッシュテーブル(ハッシュテーブル)、キー付きリスト、または連想配列(連想配列)として理解されます。
{"firstName": "Brett"、 "lastName": "McLaughlin"、 "email": "aaaa"}など - 値の順序付きリスト。ほとんどの言語では、配列として理解されます。
JSONは、Pythonのlistとdictで構成されています。
1.2jsonファイル用のPython読み取りおよび書き込みモジュール
-
json:文字列とpythonのデータ型間の変換に使用され、4つの関数を提供します:ダンプ、ダンプ、ロード、ロード
jsonダンプはデータ型を文字列に変換しますダンプはデータ型を文字列に変換してファイルに格納しますロード文字列をデータ型に変換しますファイルを文字列からデータ型にロード変換します -
pickle:python固有の型とpythonデータ型の間の変換に使用され、4つの関数を提供します: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 ...データ読み取り用のステートメントおよびオープン関数として
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( 'path + file name'、 'open mode')を使用し、2番目のパラメーターはファイルを開くモードを決定します:読み取り専用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リストジェネレーターの分割関数とネストされたループ
2.1分割機能
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)