資料基礎---《利用Python進行資料分析·第2版》第7章 資料清洗和準備
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。
在資料分析和建模的過程中,相當多的時間要用在資料準備上:載入、清理、轉換以及重塑。這些工作會佔到分析師時間的80%或更多。有時,儲存在檔案和資料庫中的資料的格式不適合某個特定的任務。許多研究者都選擇使用通用程式語言(如Python、Perl、R或Java)或UNIX文字處理工具(如sed或awk)對資料格式進行專門處理。幸運的是,pandas和內建的Python標準庫提供了一組高階的、靈活的、快速的工具,可以讓你輕鬆地將資料規整為想要的格式。
如果你發現了一種本書或pandas庫中沒有的資料操作方式,請在郵件列表或GitHub網站上提出。實際上,pandas的許多設計和實現都是由真實應用的需求所驅動的。
在本章中,我會討論處理缺失資料、重複資料、字串操作和其它分析資料轉換的工具。下一章,我會關注於用多種方法合併、重塑資料集。
7.1 處理缺失資料
在處理缺失值之前,最重要的是發現缺失值,由於資料來源可能比較複雜,不同系統中缺失值的表示方式並不一樣,應該使用unique、value_count、describe這些函式先檢視值的分佈。
在許多資料分析工作中,缺失資料是經常發生的。pandas的目標之一就是儘量輕鬆地處理缺失資料。例如,pandas物件的所有描述性統計預設都不包括缺失資料。
缺失資料在pandas中呈現的方式有些不完美,但對於大多數使用者可以保證功能正常。對於數值資料,pandas使用浮點值NaN(Not a Number)表示缺失資料。我們稱其為哨兵值,可以方便的檢測出來:
import pandas as pd
import numpy as np
string_data=pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
string_data
0 aardvark 1 artichoke 2 NaN 3 avocado dtype: object
string_data.isnull()
0 False
1 False
2 True
3 False
dtype: bool
在pandas中,我們採用了R語言中的慣用法,即將缺失值表示為NA,它表示不可用not available。在統計應用中,NA資料可能是不存在的資料或者雖然存在,但是沒有觀察到(例如,資料採集中發生了問題)。當進行資料清洗以進行分析時,最好直接對缺失資料進行分析,以判斷資料採集的問題或缺失資料可能導致的偏差。
Python內建的None值在物件陣列中也可以作為NA:
string_data[0]=None
string_data
0 None
1 artichoke
2 NaN
3 avocado
dtype: object
string_data.isnull()
0 True
1 False
2 True
3 False
dtype: bool
pandas專案中還在不斷優化內部細節以更好處理缺失資料,像使用者API功能,例如pandas.isnull,去除了許多惱人的細節。表7-1列出了一些關於缺失資料處理的函式。
方法 | 說明 |
---|---|
drona | 根據各標籤的值中是否存在缺失資料對軸標籤進行過濾,可通過閾值調節對缺失值的容忍度 |
fillIna | 用指定值或插值方法(如f或bf)填充缺失資料 |
isnull | 返回一個含有布林值的物件,這些布林值表示哪些值是缺失值/NA,該物件的型別與源型別一樣 |
notnull | isnull否定式 |
濾除缺失資料
過濾掉缺失資料的辦法有很多種。你可以通過pandas.isnull或布林索引的手工方法,但dropna可能會更實用一些。對於一個Series,dropna返回一個僅含非空資料和索引值的Series:
from numpy import nan as NA
data=pd.Series([1, NA, 3.5, NA, 7])
data
0 1.0
1 NaN
2 3.5
3 NaN
4 7.0
dtype: float64
data.dropna()
0 1.0
2 3.5
4 7.0
dtype: float64
data
0 1.0
1 NaN
2 3.5
3 NaN
4 7.0
dtype: float64
這等價於:
data[data.notnull()]
0 1.0
2 3.5
4 7.0
dtype: float64
而對於DataFrame物件,事情就有點複雜了。你可能希望丟棄全NA或含有NA的行或列。dropna預設丟棄任何含有缺失值的行:
data=pd.DataFrame([[1., 6.5, 3.], [1., NA, NA],[NA, NA, NA], [NA, 6.5, 3.]])
data
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
2 | NaN | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
cleaned =data.dropna()
cleaned
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
傳入how='all’將只丟棄全為NA的那些行:
data.dropna(how='all')
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
用這種方式丟棄列,只需傳入axis=1即可:
data[4]=NA
data
0 | 1 | 2 | 4 | |
---|---|---|---|---|
0 | 1.0 | 6.5 | 3.0 | NaN |
1 | 1.0 | NaN | NaN | NaN |
2 | NaN | NaN | NaN | NaN |
3 | NaN | 6.5 | 3.0 | NaN |
data.dropna(axis=1,how='all')
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
2 | NaN | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
另一個濾除DataFrame行的問題涉及時間序列資料。假設你只想留下一部分觀測資料,可以用thresh引數實現此目的:
df = pd.DataFrame(np.random.randn(7, 3))
df.iloc[:4,1]=NA
df.iloc[:2,2]=NA
df
0 | 1 | 2 | |
---|---|---|---|
0 | 0.178632 | NaN | NaN |
1 | 1.246954 | NaN | NaN |
2 | 0.427497 | NaN | -0.086087 |
3 | -0.102457 | NaN | 0.308933 |
4 | 0.351837 | 0.299638 | -0.749301 |
5 | -1.035660 | 0.613805 | 1.387823 |
6 | -1.446220 | 0.482409 | -0.061598 |
df.dropna()
0 | 1 | 2 | |
---|---|---|---|
4 | 0.351837 | 0.299638 | -0.749301 |
5 | -1.035660 | 0.613805 | 1.387823 |
6 | -1.446220 | 0.482409 | -0.061598 |
df.dropna(thresh=2)#至少要有兩個以上缺失值的行才會被過濾
0 | 1 | 2 | |
---|---|---|---|
2 | 0.427497 | NaN | -0.086087 |
3 | -0.102457 | NaN | 0.308933 |
4 | 0.351837 | 0.299638 | -0.749301 |
5 | -1.035660 | 0.613805 | 1.387823 |
6 | -1.446220 | 0.482409 | -0.061598 |
填充缺失資料
你可能不想濾除缺失資料(有可能會丟棄跟它有關的其他資料),而是希望通過其他方式填補那些“空洞”。對於大多數情況而言,fillna方法是最主要的函式。通過一個常數呼叫fillna就會將缺失值替換為那個常數值:
df.fillna(0)
0 | 1 | 2 | |
---|---|---|---|
0 | 0.178632 | 0.000000 | 0.000000 |
1 | 1.246954 | 0.000000 | 0.000000 |
2 | 0.427497 | 0.000000 | -0.086087 |
3 | -0.102457 | 0.000000 | 0.308933 |
4 | 0.351837 | 0.299638 | -0.749301 |
5 | -1.035660 | 0.613805 | 1.387823 |
6 | -1.446220 | 0.482409 | -0.061598 |
若是通過一個字典呼叫fillna,就可以實現對不同的列填充不同的值:
df.fillna({1:0.5,2:0})
0 | 1 | 2 | |
---|---|---|---|
0 | 0.178632 | 0.500000 | 0.000000 |
1 | 1.246954 | 0.500000 | 0.000000 |
2 | 0.427497 | 0.500000 | -0.086087 |
3 | -0.102457 | 0.500000 | 0.308933 |
4 | 0.351837 | 0.299638 | -0.749301 |
5 | -1.035660 | 0.613805 | 1.387823 |
6 | -1.446220 | 0.482409 | -0.061598 |
fillna預設會返回新物件,但也可以對現有物件進行就地修改:
df.fillna(0, inplace=True)
df
0 | 1 | 2 | |
---|---|---|---|
0 | 0.178632 | 0.000000 | 0.000000 |
1 | 1.246954 | 0.000000 | 0.000000 |
2 | 0.427497 | 0.000000 | -0.086087 |
3 | -0.102457 | 0.000000 | 0.308933 |
4 | 0.351837 | 0.299638 | -0.749301 |
5 | -1.035660 | 0.613805 | 1.387823 |
6 | -1.446220 | 0.482409 | -0.061598 |
對reindexing有效的那些插值方法也可用於fillna:
df = pd.DataFrame(np.random.randn(6, 3))
df.iloc[2:,1]=NA
df.iloc[4:,2]=NA
df
0 | 1 | 2 | |
---|---|---|---|
0 | 1.075599 | 0.447231 | -1.856044 |
1 | -0.484075 | -0.403936 | -1.786744 |
2 | 0.583496 | NaN | -0.003471 |
3 | 0.364301 | NaN | 1.570826 |
4 | -1.121330 | NaN | NaN |
5 | -0.384293 | NaN | NaN |
df.fillna(method='ffill')
0 | 1 | 2 | |
---|---|---|---|
0 | 1.075599 | 0.447231 | -1.856044 |
1 | -0.484075 | -0.403936 | -1.786744 |
2 | 0.583496 | -0.403936 | -0.003471 |
3 | 0.364301 | -0.403936 | 1.570826 |
4 | -1.121330 | -0.403936 | 1.570826 |
5 | -0.384293 | -0.403936 | 1.570826 |
df.fillna(method='ffill',limit=2)
0 | 1 | 2 | |
---|---|---|---|
0 | 1.075599 | 0.447231 | -1.856044 |
1 | -0.484075 | -0.403936 | -1.786744 |
2 | 0.583496 | -0.403936 | -0.003471 |
3 | 0.364301 | -0.403936 | 1.570826 |
4 | -1.121330 | NaN | 1.570826 |
5 | -0.384293 | NaN | 1.570826 |
在dropna中使用thresh來控制,而在fillna中使用limit來控制
只要有些創新,你就可以利用fillna實現許多別的功能。比如說,你可以傳入Series的平均值或中位數:
data = pd.Series([1., NA, 3.5, NA, 7])
data.fillna(data.mean())
0 1.000000
1 3.833333
2 3.500000
3 3.833333
4 7.000000
dtype: float64
表7-2列出了fillna的參考。
引數 | 說明 |
---|---|
value | 用於填充缺失值的標量值或字典物件 |
method | 插值方式。如果函式呼叫時未指定其他引數的話,預設為“ffill” |
axis | 待填充的軸,預設axis=0 |
inplace | 修改呼叫者物件而不產生副本 |
limit | (對於前向和後向填充)可以連續填充的最大數量 |
7.2 資料轉換
本章到目前為止介紹的都是資料的重排。另一類重要操作則是過濾、清理以及其他的轉換工作。
移除重複資料
DataFrame中出現重複行(值一模一樣的兩行)有多種原因。下面就是一個例子:
data = pd.DataFrame({'k1': ['one', 'two'] * 3 + ['two'], 'k2': [1, 1, 2, 3, 3, 4, 4]})
data
k1 | k2 | |
---|---|---|
0 | one | 1 |
1 | two | 1 |
2 | one | 2 |
3 | two | 3 |
4 | one | 3 |
5 | two | 4 |
6 | two | 4 |
DataFrame的duplicated方法返回一個布林型Series,表示各行是否是重複行(前面出現過的行):
data.duplicated()
0 False
1 False
2 False
3 False
4 False
5 False
6 True
dtype: bool
還有一個與此相關的drop_duplicates方法,它會返回一個DataFrame,重複的陣列會標為False:
data.drop_duplicates()
k1 | k2 | |
---|---|---|
0 | one | 1 |
1 | two | 1 |
2 | one | 2 |
3 | two | 3 |
4 | one | 3 |
5 | two | 4 |
這兩個方法預設會判斷全部列,你也可以指定部分列進行重複項判斷。假設我們還有一列值,且只希望根據k1列過濾重複項:
data['V1']=range(7)
data
k1 | k2 | V1 | |
---|---|---|---|
0 | one | 1 | 0 |
1 | two | 1 | 1 |
2 | one | 2 | 2 |
3 | two | 3 | 3 |
4 | one | 3 | 4 |
5 | two | 4 | 5 |
6 | two | 4 | 6 |
data.drop_duplicates(['k1'])
k1 | k2 | V1 | |
---|---|---|---|
0 | one | 1 | 0 |
1 | two | 1 | 1 |
duplicated和drop_duplicates預設保留的是第一個出現的值組合。傳入keep='last’則保留最後一個:
data.drop_duplicates(['k1','k2'],keep='last')
k1 | k2 | V1 | |
---|---|---|---|
0 | one | 1 | 0 |
1 | two | 1 | 1 |
2 | one | 2 | 2 |
3 | two | 3 | 3 |
4 | one | 3 | 4 |
6 | two | 4 | 6 |
利用函式或對映進行資料轉換
對於許多資料集,你可能希望根據陣列、Series或DataFrame列中的值來實現轉換工作。我們來看看下面這組有關肉類的資料:
data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon','Pastrami', 'corned beef', 'Bacon','pastrami', 'honey ham', 'nova lox'], 'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
data
food | ounces | |
---|---|---|
0 | bacon | 4.0 |
1 | pulled pork | 3.0 |
2 | bacon | 12.0 |
3 | Pastrami | 6.0 |
4 | corned beef | 7.5 |
5 | Bacon | 8.0 |
6 | pastrami | 3.0 |
7 | honey ham | 5.0 |
8 | nova lox | 6.0 |
假設你想要新增一列表示該肉類食物來源的動物型別。我們先編寫一個不同肉類到動物的對映:
meat_to_animal = { 'bacon': 'pig', 'pulled pork': 'pig', 'pastrami': 'cow', 'corned beef': 'cow', 'honey ham': 'pig', 'nova lox': 'salmon' }
Series的map方法可以接受一個函式或含有對映關係的字典型物件,但是這裡有一個小問題,即有些肉類的首字母大寫了,而另一些則沒有。因此,我們還需要使用Series的str.lower方法,將各個值轉換為小寫:
lowercased =data['food'].str.lower()
lowercased
0 bacon
1 pulled pork
2 bacon
3 pastrami
4 corned beef
5 bacon
6 pastrami
7 honey ham
8 nova lox
Name: food, dtype: object
data['animal']=lowercased.map(meat_to_animal)
data
food | ounces | animal | |
---|---|---|---|
0 | bacon | 4.0 | pig |
1 | pulled pork | 3.0 | pig |
2 | bacon | 12.0 | pig |
3 | Pastrami | 6.0 | cow |
4 | corned beef | 7.5 | cow |
5 | Bacon | 8.0 | pig |
6 | pastrami | 3.0 | cow |
7 | honey ham | 5.0 | pig |
8 | nova lox | 6.0 | salmon |
我們也可以傳入一個能夠完成全部這些工作的函式:
data['food'].map(lambda x:meat_to_animal[x.lower()])
0 pig
1 pig
2 pig
3 cow
4 cow
5 pig
6 cow
7 pig
8 salmon
Name: food, dtype: object
使用map是一種實現元素級轉換以及其他資料清理工作的便捷方式。這裡是利用Series的map函式,實現對Series元素級別的操作;也可以直接使用map,傳入函式,和多個Series,實現多個Series對應元素之間的加減乘除等更為複雜的操作。
替換值
利用fillna方法填充缺失資料可以看做值替換的一種特殊情況。前面已經看到,map可用於修改物件的資料子集,而replace則提供了一種實現該功能的更簡單、更靈活的方式。我們來看看下面這個Series:
data = pd.Series([1., -999., 2., -999., -1000., 3.])
data
0 1.0
1 -999.0
2 2.0
3 -999.0
4 -1000.0
5 3.0
dtype: float64
-999這個值可能是一個表示缺失資料的標記值。要將其替換為pandas能夠理解的NA值,我們可以利用replace來產生一個新的Series(除非傳入inplace=True):
data.replace(-999,NA)
0 1.0
1 NaN
2 2.0
3 NaN
4 -1000.0
5 3.0
dtype: float64
如果你希望一次性替換多個值,可以傳入一個由待替換值組成的列表以及一個替換值::
data.replace([-999,-1000],NA)
0 1.0
1 NaN
2 2.0
3 NaN
4 NaN
5 3.0
dtype: float64
要讓每個值有不同的替換值,可以傳遞一個替換列表:
data.replace([-999,-1000],[np.nan,0])
0 1.0
1 NaN
2 2.0
3 NaN
4 0.0
5 3.0
dtype: float64
傳入的引數也可以是字典:
data.replace({-999:np.nan,-1000:0})
0 1.0
1 NaN
2 2.0
3 NaN
4 0.0
5 3.0
dtype: float64
筆記:data.replace方法與data.str.replace不同,後者做的是字串的元素級替換。我們會在後面學習Series的字串方法。
重新命名軸索引
跟Series中的值一樣,軸標籤也可以通過函式或對映進行轉換,從而得到一個新的不同標籤的物件。軸還可以被就地修改,而無需新建一個數據結構。接下來看看下面這個簡單的例子:
data = pd.DataFrame(np.arange(12).reshape((3, 4)),index=['Ohio', 'Colorado', 'New York'],columns=['one', 'two', 'three', 'four'])
data
one | two | three | four | |
---|---|---|---|---|
Ohio | 0 | 1 | 2 | 3 |
Colorado | 4 | 5 | 6 | 7 |
New York | 8 | 9 | 10 | 11 |
跟Series一樣,軸索引也有一個map方法:
transform = lambda x:x[:4].upper()
data.index.map(transform)
Index(['OHIO', 'COLO', 'NEW '], dtype='object')
你可以將其賦值給index,這樣就可以對DataFrame進行就地修改:
data.index=data.index.map(transform)
data
one | two | three | four | |
---|---|---|---|---|
OHIO | 0 | 1 | 2 | 3 |
COLO | 4 | 5 | 6 | 7 |
NEW | 8 | 9 | 10 | 11 |
如果想要建立資料集的轉換版(而不是修改原始資料),比較實用的方法是rename:
data.rename(index=str.title,columns=str.upper)
ONE | TWO | THREE | FOUR | |
---|---|---|---|---|
Ohio | 0 | 1 | 2 | 3 |
Colo | 4 | 5 | 6 | 7 |
New | 8 | 9 | 10 | 11 |
data
one | two | three | four | |
---|---|---|---|---|
OHIO | 0 | 1 | 2 | 3 |
COLO | 4 | 5 | 6 | 7 |
NEW | 8 | 9 | 10 | 11 |
特別說明一下,rename可以結合字典型物件實現對部分軸標籤的更新:
data.rename(index={'OHIO': 'INDIANA'},columns={'three': 'peekaboo'})
one | two | peekaboo | four | |
---|---|---|---|---|
INDIANA | 0 | 1 | 2 | 3 |
COLO | 4 | 5 | 6 | 7 |
NEW | 8 | 9 | 10 | 11 |
rename可以實現複製DataFrame並對其索引和列標籤進行賦值。如果希望就地修改某個資料集,傳入inplace=True即可:
data.rename(index={'OHIO':'INDIANA'},inplace=True)
data
one | two | three | four | |
---|---|---|---|---|
INDIANA | 0 | 1 | 2 | 3 |
COLO | 4 | 5 | 6 | 7 |
NEW | 8 | 9 | 10 | 11 |
離散化和麵元劃分
為了便於分析,連續資料常常被離散化或拆分為“面元”(bin)。假設有一組人員資料,而你希望將它們劃分為不同的年齡組:
ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
接下來將這些資料劃分為“18到25”、“26到35”、“35到60”以及“60以上”幾個面元。要實現該功能,你需要使用pandas的cut函式:
bins = [18, 25, 35, 60, 100]
cats = pd.cut(ages,bins)
cats
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
Length: 12
Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
pandas返回的是一個特殊的Categorical物件。結果展示了pandas.cut劃分的面元。你可以將其看做一組表示面元名稱的字串。它的底層含有一個表示不同分類名稱的型別陣列,以及一個codes屬性中的年齡資料的標籤:一組分隔區間,然後將元素用這些區間去套,套在哪個區間,就記錄哪個區間;同時codes屬性會對這些分隔區間編號。
cats.codes
array([0, 0, 0, 1, 0, 0, 2, 1, 3, 2, 2, 1], dtype=int8)
cats.categories
IntervalIndex([(18, 25], (25, 35], (35, 60], (60, 100]]
closed='right',
dtype='interval[int64]')
pd.value_counts(cats)
(18, 25] 5
(35, 60] 3
(25, 35] 3
(60, 100] 1
dtype: int64
pd.value_counts(cats)是pandas.cut結果的面元計數。
跟“區間”的數學符號一樣,圓括號表示開端,而方括號則表示閉端(包括)。哪邊是閉端可以通過right=False進行修改:
pd.cut(ages,[18, 26, 36, 61, 100],right=False)
[[18, 26), [18, 26), [18, 26), [26, 36), [18, 26), ..., [26, 36), [61, 100), [36, 61), [36, 61), [26, 36)]
Length: 12
Categories (4, interval[int64]): [[18, 26) < [26, 36) < [36, 61) < [61, 100)]
你可 以通過傳遞一個列表或陣列到labels,設定自己的面元名稱:
group_names = ['Youth', 'YoungAdult', 'MiddleAged', 'Senior']
pd.cut(ages,bins,labels=group_names)
[Youth, Youth, Youth, YoungAdult, Youth, ..., YoungAdult, Senior, MiddleAged, MiddleAged, YoungAdult]
Length: 12
Categories (4, object): [Youth < YoungAdult < MiddleAged < Senior]
如果向cut傳入的是面元的數量而不是確切的面元邊界,則它會根據資料的最小值和最大值計算等長面元。下面這個例子中,我們將一些均勻分佈的資料分成四組:
data = np.random.rand(20)
pd.cut(data,4,precision=2)
[(0.72, 0.94], (0.29, 0.5], (0.072, 0.29], (0.072, 0.29], (0.5, 0.72], ..., (0.72, 0.94], (0.5, 0.72], (0.29, 0.5], (0.29, 0.5], (0.5, 0.72]]
Length: 20
Categories (4, interval[float64]): [(0.072, 0.29] < (0.29, 0.5] < (0.5, 0.72] < (0.72, 0.94]]
選項precision=2,限定小數只有兩位。
qcut是一個非常類似於cut的函式,它可以根據樣本分位數對資料進行面元劃分。根據資料的分佈情況,cut可能無法使各個面元中含有相同數量的資料點。而qcut由於使用的是樣本分位數,因此可以得到大小基本相等的面元:
data = np.random.randn(1000
相關推薦
《計算機演算法設計與分析 第2版+第3版+第4版 (王曉東) 》原書附答案pdf版電子書附下載連結+30個總結JVM虛擬機器的技術文排版好(收藏版)
技術書閱讀方法論
一.速讀一遍(最好在1~2天內完成)
人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。
對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的
JavaScript DOM程式設計藝術(第2版)第二章 語法
一.變數
把值存在變數的操作——賦值 JavaScript可以直接對變數賦值而不需事先宣告。 如果在對某個變數賦值前沒有宣告,賦值操作會自動宣告該變數。var age; JavaScript中變數不能包含空格或標點符號 變數可以使用駝峰命名
二.資料型別
1.必須明確型別宣告
算法競賽入門經典第2版 第1章
計算 const 解決問題 pause 會有 return 數學 getchar() scanf 學習目標:
熟悉C語言程序的編譯和運行
學會編程計算並輸出常見的算術表達式的結果
掌握整數和浮點數的含義和輸出方法、聲明方法、讀入方法
掌握數學函數的使用方法
演算法競賽入門經典第2版 第2章 迴圈結構
學習目標
掌握for迴圈、while迴圈、do-while迴圈的使用方法
學會使用計數器和累加器
學會用輸出中間結果的方法除錯
學會用計時函式測試程式效率
學會用重定向、fopen的方式讀寫檔案
瞭解演算法競賽對檔案讀寫方式和命名的嚴格性
記住變數在賦值之前的值是不確
《演算法競賽入門經典》(第2版)第二章習題
本文部分習題參考了litiouslove的blog: http://blog.csdn.net/litiouslove/article/details/7891700
習題2-1 水仙花數(daffodil) 輸出100~999中的所有水仙花數。若3位數ABC滿足ABC=A3+B3+
《演算法競賽入門經典》(第2版)第一章 部分實驗題
1.5.2資料型別實驗
實驗A1:表示式11111*11111的值是多少?把5個1改成6個1呢?9個1呢? 實驗A2:把實驗A1中的所有數換成浮點數,結果如何? 實驗A3:表示式sqrt(-10)的值是多少?嘗試用各種方式輸出。在計算的過程中系統會報錯嗎? 實驗A4:表示式1.0/
[刷題]演算法競賽入門經典(第2版) 4-7/UVa509
//UVa509 - RAID!
#include<iostream>
int d, s, b, t, times = 0;
char disk_data[7][6666], type;
inline char* disk(int x, i
資料基礎---《利用Python進行資料分析·第2版》第12章 pandas高階應用
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。
前面的章節關注於不同型別的資料規整流程和NumPy、pandas與其它庫的特點。隨著時間的發展,pandas發展出了更多適
資料基礎---《利用Python進行資料分析·第2版》第6章 資料載入、儲存與檔案格式
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。
訪問資料是使用本書所介紹的這些工具的第一步。我會著重介紹pandas的資料輸入與輸出,雖然別的庫中也有不少以此為目的的工具
資料基礎---《利用Python進行資料分析·第2版》第4章 NumPy基礎:陣列和向量計算
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。
NumPy(Numerical Python的簡稱)是Python數值計算最重要的基礎包。大多數提供科學計算的包都是用Nu
資料基礎---《利用Python進行資料分析·第2版》第11章 時間序列
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。
時間序列(time series)資料是一種重要的結構化資料形式,應用於多個領域,包括金融學、經濟學、生態學、神經科學、物
資料基礎---《利用Python進行資料分析·第2版》第10章 資料聚合與分組運算
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。
對資料集進行分組並對各組應用一個函式(無論是聚合還是轉換),通常是資料分析工作中的重要環節。在將資料集載入、融合、準備好之
資料基礎---《利用Python進行資料分析·第2版》第8章 資料規整:聚合、合併和重塑
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。
在許多應用中,資料可能分散在許多檔案或資料庫中,儲存的形式也不利於分析。本章關注可以聚合、合併、重塑資料的方法。
首先
資料基礎---《利用Python進行資料分析·第2版》第7章 資料清洗和準備
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。
在資料分析和建模的過程中,相當多的時間要用在資料準備上:載入、清理、轉換以及重塑。這些工作會佔到分析師時間的80%或更多。
資料基礎---《利用Python進行資料分析·第2版》第5章 pandas入門
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。
pandas是本書後續內容的首選庫。它含有使資料清洗和分析工作變得更快更簡單的資料結構和操作工具。pandas經常和其它工
利用Python進行資料分析之第七章 記錄2 資料規整化:清理、轉換、合併、重塑
索引上的合併
DataFrame中傳入引數left_index=True或者right_index=True(或者兩個都傳入),表示DataFrame的index(索引)被用作兩個DataFrame連線的連線鍵,如下:
dataframe1 = DataFrame({'key':
利用Python進行資料分析之第七章記錄 資料規整化:清理、轉換、合併、重塑
合併資料集:
pandas物件中的資料可以通過一些內建的方式進行合併:
pandas.merge可根據一個或多個鍵將不同DataFrame中的行連線起來。SQL或其它關係型資料庫的使用者對此應該會比較熟悉,因為它實現的就是資料庫的連線操作。
pandas.concat可以沿著一條軸將多個
➢《利用Python進行資料分析》(原書第2版)|書籍分享
《利用Python進行資料分析》(原書第2版)
英: Python for Data Analysis: Data Wrangling with Pand
適讀人群 :適合剛學Python的資料分析師或剛學資料科學以及科學計算的Python程式設計者。
閱
【利用python進行資料分析——基礎篇】利用Python處理和分析Excel表中資料實戰
作為一個學習用Python進行資料分析的新手來說,通過本文來記錄分享一些我在用Python中的pandas、numpy來分析Excel表中資料的資料清洗和整理的工作,目的是熟悉numpy以及pandas基礎操作,所有操作利用Excel均可以方便實現。備註:本文中使用的是ipy
2018最新Python資料分析實戰教程視訊 python資料分析班視訊 Python資料分析基礎教程 利用Python進行資料分析
系列一:《python資料分析基礎與實踐》章節1Python概況課時2Python簡介章節2Python安裝課時3安裝Anaconda課時4使用Anaconda章節3資料準備課時5資料型別 – 布林型課時6資料型別 – 數值型課時7資料型別 – 字元型課時8資料結構 – List課時9資料結構 – Tuple