Head 與 Tail
head() 與 tail() 用於快速預覽 Series 與 DataFrame,默認顯示 5 條數據,也可以指定顯示數據的數量。

屬性與底層數據
Pandas 可以通過多個屬性訪問元數據:
-
shape:
- 輸出對象的軸維度,與 ndarray 一致
-
軸標簽
- Series: Index (僅有此軸)
- DataFrame: Index (行) 與列
注意: 為屬性賦值是安全的!

Pandas 對象(Index, Series, DataFrame)相當於數組的容器,用於存儲數據、執行計算。大部分類型的底層數組都是 numpy.ndarray。不過,Pandas 與第三方支持庫一般都會擴展 NumPy 類型系統,添加自定義數組(見數據類型)。
.array 屬性用於提取 Index 或 Series 里的數據。

提取 NumPy 數組,用 to_numpy() 或 numpy.asarray()。

to_numpy() 可以控制 numpy.ndarray 生成的數據類型。以帶時區的 datetime 為例,NumPy 未提供時區信息的 datetime 數據類型,Pandas 則提供了兩種表現形式:
-
一種是帶
Timestamp的numpy.ndarray,提供了正確的tz信息。 -
另一種是
datetime64[ns],這也是一種numpy.ndarray,值被轉換為 UTC,但去掉了時區信息。
時區信息可以用 dtype=object 保存。

或用 dtype='datetime64[ns]' 去除。

提取 DataFrame 里的原數據稍微有點復雜。DataFrame 里所有列的數據類型都一樣時,DataFrame.to_numpy() 返回底層數據:

匹配/廣播機制
DataFrame 支持 add()、sub()、mul()、div() 及 radd()、rsub() 等方法執行二進制操作。
廣播機制重點關注輸入的 Series。通過 axis 關鍵字,匹配 index 或 columns 即可調用這些函數。



還可以用 Series 對齊多層索引 DataFrame 的某一層級。

Series 與 Index 還支持 divmod() 內置函數,該函數同時執行向下取整除與模運算,返回兩個與左側類型相同的元組。示例如下:

divmod() 還支持元素級運算:

缺失值與填充缺失值操作
Series 與 DataFrame 的算數函數支持 fill_value 選項,即用指定值替換某個位置的缺失值。比如,兩個 DataFrame 相加,除非兩個 DataFrame 里同一個位置都有缺失值,其相加的和仍為 NaN,如果只有一個 DataFrame 里存在缺失值,則可以用 fill_value 指定一個值來替代 NaN,當然,也可以用 fillna 把 NaN 替換為想要的值。

比較操作
與上一小節的算數運算類似,Series 與 DataFrame 還支持 eq、ne、lt、gt、le、ge 等二進制比較操作的方法:

布爾簡化
empty、any()、all()、bool() 可以把數據匯總簡化至單個布爾值。

還可以進一步把上面的結果簡化為單個布爾值。

通過 empty 屬性,可以驗證 Pandas 對象是否為空。

比較對象是否等效
一般情況下,多種方式都能得出相同的結果。以 df + df 與 df * 2 為例。
應用上一小節學到的知識,測試這兩種計算方式的結果是否一致,一般人都會用 (df + df == df * 2).all(),不過,這個表達式的結果是 False:

注意:布爾型 DataFrame df + df == df * 2 中有 False 值!這是因為兩個 NaN 值的比較結果為不等:
為了驗證數據是否等效,Series 與 DataFrame 等 N 維框架提供了 equals() 方法,用這個方法驗證 NaN 值的結果為相等。
注意:Series 與 DataFrame 索引的順序必須一致,驗證結果才能為 True:

合並重疊數據集
一個 DataFrame 中的缺失值將按指定條件用另一個 DataFrame 里類似標簽中的數據進行填充。要實現這一操作,請用下列代碼中的 combine_first() 函數。



描述性統計
Series 與 DataFrame 支持大量計算描述性統計的方法與操作。這些方法大部分都是 sum()、mean()、quantile() 等聚合函數,其輸出結果比原始數據集小;此外,還有輸出結果與原始數據集同樣大小的 cumsum() 、 cumprod() 等函數。這些方法都基本上都接受 axis 參數,如, ndarray.{sum,std,…},但這里的 axis 可以用名稱或整數指定:
- Series:無需
axis參數 - DataFrame:
index,即axis=0,默認值columns, 即axis=1

上述方法都支持 skipna 關鍵字,指定是否要排除缺失數據,默認值為 True。

注 : cumsum() 與 cumprod() 等方法保留 NaN 值的位置。這與 expanding() 和 rolling() 略顯不同,詳情請參閱本文。

下表為常用函數匯總表。每個函數都支持 level 參數,僅在數據對象為結構化 Index 時使用。
| 函數 | 描述 |
|---|---|
count |
統計非空值數量 |
sum |
匯總值 |
mean |
平均值 |
mad |
平均絕對偏差 |
median |
算數中位數 |
min |
最小值 |
max |
最大值 |
mode |
眾數 |
abs |
絕對值 |
prod |
乘積 |
std |
貝塞爾校正的樣本標准偏差 |
var |
無偏方差 |
sem |
平均值的標准誤差 |
skew |
樣本偏度 (第三階) |
kurt |
樣本峰度 (第四階) |
quantile |
樣本分位數 (不同 % 的值) |
cumsum |
累加 |
cumprod |
累乘 |
cummax |
累積最大值 |
cummin |
累積最小值 |
注意:NumPy 的 mean、std、sum 等方法默認不統計 Series 里的空值。但是narray 空值會計算

Series.nunique() 返回 Series 里所有非空值的唯一值。
數據總結:describe
最大值與最小值對應的索引

值計數(直方圖)與眾數

與上述操作類似,還可以統計 Series 或 DataFrame 的眾數,即出現頻率最高的值:

離散化與分位數
cut() 函數(以值為依據實現分箱)及 qcut() 函數(以樣本分位數為依據實現分箱)用於連續值的離散化:

函數應用
不管是為 Pandas 對象應用自定義函數,還是應用第三方函數,都離不開以下三種方法。用哪種方法取決於操作的對象是 DataFrame,還是 Series ;是行、列,還是元素。
-
表級函數應用:
pipe() -
行列級函數應用:
apply() -
聚合 API:
agg()與transform() -
元素級函數應用:
applymap()
#表級函數應用
雖然可以把 DataFrame 與 Series 傳遞給函數,不過鏈式調用函數時,最好使用 pipe() 方法。對比以下兩種方式:
pipe() 方法。對比以下兩種方式:
f(g(h(df), arg1=1), arg2=2, arg3=3)
(df.pipe(h).pipe(g, arg1=1).pipe(f, arg2=2, arg3=3))
后面再補充吧,沒看懂
行列級函數應用
apply() 方法沿着 DataFrame 的軸應用函數,比如,描述性統計方法,該方法支持 axis 參數。


用好 apply() 可以了解數據集的很多信息。比如可以提取每列的最大值對應的日期:

聚合 API
聚合 API 可以快速、簡潔地執行多個聚合操作。Pandas 對象支持多個類似的 API,如 groupby API、window functions API、resample API。
聚合函數為DataFrame.aggregate(),它的別名是 DataFrame.agg()。

應用單個函數時,該操作與 apply() 等效,這里也可以用字符串表示聚合函數名。下面的聚合函數輸出的結果為 Series:

Series 單個聚合操作返回標量值:

多函數聚合
還可以用列表形式傳遞多個聚合函數。每個函數在輸出結果 DataFrame 里以行的形式顯示,行名是每個聚合函數的函數名。.

Series 聚合多函數返回結果還是 Series,索引為函數名:

傳遞 lambda 函數時,輸出名為 <lambda> 的行:

指定為哪些列應用哪些聚合函數時,需要把包含列名與標量(或標量列表)的字典傳遞給 DataFrame.agg。
注意:這里輸出結果的順序不是固定的,要想讓輸出順序與輸入順序一致,請使用 OrderedDict。

Transform API
0.20.0 版新增。
transform() 方法的返回結果與原始數據的索引相同,大小相同。與 .agg API 類似,該 API 支持同時處理多種操作,不用一個一個操作。

多函數 Transform
transform() 調用多個函數時,生成多層索引 DataFrame。第一層是原始數據集的列名;第二層是 transform() 調用的函數名。

用字典執行 transform 操作
函數字典可以為每列執行指定 transform() 操作。

元素級函數應用
並非所有函數都能矢量化,即接受 NumPy 數組,返回另一個數組或值,DataFrame 的 applymap() 及 Series 的 map() ,支持任何接收單個值並返回單個值的 Python 函數。


Series.map() 還有個功能,可以“連接”或“映射”第二個 Series 定義的值。這與 merging / joining 功能聯系非常緊密:

重置索引與更換標簽
reindex() 是 Pandas 里實現數據對齊的基本方法,該方法執行幾乎所有功能都要用到的標簽對齊功能。 reindex 指的是沿着指定軸,讓數據與給定的一組標簽進行匹配。該功能完成以下幾項操作:
- 讓現有數據匹配一組新標簽,並重新排序;
- 在無數據但有標簽的位置插入缺失值(
NA)標記; - 如果指定,則按邏輯填充無標簽的數據,該操作多見於時間序列數據。

DataFrame 支持同時 reindex 索引與列:

reindex 還支持 axis 關鍵字:

重置索引,並與其它對象對齊
提取一個對象,並用另一個具有相同標簽的對象 reindex 該對象的軸。這種操作的語法雖然簡單,但未免有些啰嗦。
這時,最好用 reindex_like() 方法,這是一種既有效,又簡單的方式:

用 align 對齊多個對象
align() 方法是對齊兩個對象最快的方式,該方法支持 join 參數
join='outer':使用兩個對象索引的合集,默認值join='left':使用左側調用對象的索引join='right':使用右側傳遞對象的索引join='inner':使用兩個對象索引的交集
該方法返回重置索引后的兩個 Series 元組:



| 方法 | 動作 |
|---|---|
| pad / ffill | 先前填充 |
| bfill / backfill | 向后填充 |
| nearest | 從最近的索引值填充 |
下面用一個簡單的 Series 展示 fill 方法:



重置索引填充的限制
limit 與 tolerance 參數可以控制 reindex 的填充操作。limit 限定了連續匹配的最大數量:

反之,tolerance 限定了索引與索引器值之間的最大距離:

去掉軸上的標簽
drop() 函數與 reindex 經常配合使用,該函數用於刪除軸上的一組標簽:

重命名或映射標簽
rename() 方法支持按不同的軸基於映射(字典或 Series)調整標簽。

如果調用的是函數,該函數在處理標簽時,必須返回一個值,而且生成的必須是一組唯一值。此外,rename() 還可以調用字典或 Series。

rename() 方法還提供了 inplace 命名參數,默認為 False,並會復制底層數據。inplace=True 時,會直接在原數據上重命名。
迭代
Pandas 對象基於類型進行迭代操作。Series 迭代時被視為數組,基礎迭代生成值。DataFrame 則遵循字典式習語,用對象的 key 實現迭代操作。
簡言之,基礎迭代(for i in object)生成:
- Series :值
- DataFrame:列標簽
例如,DataFrame 迭代時輸出列名:

項目(items)
與字典型接口類似,items() 通過鍵值對進行迭代:
- Series:(Index,標量值)對
- DataFrame:(列,Series)對

iterrows
iterrows() 迭代 DataFrame 或 Series 里的每一行數據。這個操作返回一個迭代器,生成索引值及包含每行數據的 Series:

.dt 訪問器
Series 提供一個可以簡單、快捷地返回 datetime 屬性值的訪問器。這個訪問器返回的也是 Series,索引與現有的 Series 一樣。


用下列表達式進行篩選非常方便:

時區轉換也很輕松:

還可以用 Series.dt.strftime() 把 datetime 的值當成字符串進行格式化,支持與標准 strftime() 同樣的格式。

#矢量化字符串方法
Series 支持字符串處理方法,可以非常方便地操作數組里的每個元素。
這些方法會自動排除缺失值與空值,這也許是其最重要的特性。
這些方法通過 Series 的 str 屬性訪問,一般情況下,這些操作的名稱與內置的字符串方法一致。示例如下:

排序
Pandas 支持三種排序方式,按索引標簽排序,按列里的值排序,按兩種方式混合排序。
#按索引排序
Series.sort_index() 與 DataFrame.sort_index() 方法用於按索引層級對 Pandas 對象排序。


按值排序
Series.sort_values() 方法用於按值對 Series 排序。
DataFrame.sort_values() 方法用於按行列的值對 DataFrame 排序。
DataFrame.sort_values() 的可選參數 by 用於指定按哪列排序,該參數的值可以是一列或多列數據。

按索引與值排序
通過參數 by 傳遞給 DataFrame.sort_values() 的字符串可以引用列或索引層名。


搜索排序
Series 支持 searchsorted() 方法,這與numpy.ndarray.searchsorted() 的操作方式類似。

最大值與最小值
Series 支持 nsmallest() 與 nlargest() 方法,本方法返回 N 個最大或最小的值。
對於數據量大的 Series 來說,該方法比先為整個 Series 排序,再調用 head(n) 這種方式的速度要快得多。


DataFrame 也支持 nlargest 與 nsmallest 方法。



#復制
在 Pandas 對象上執行 copy() 方法,將復制底層數據(但不包括軸索引,因為軸索引不可變),並返回一個新的對象。注意,復制對象這種操作一般來說不是必須的。比如說,以下幾種方式可以***就地(inplace)*** 改變 DataFrame:
- 插入、刪除、修改列
- 為
index或columns屬性賦值 - 對於同質數據,用
values屬性或高級索引即可直接修改值
注意,用 Pandas 方法修改數據不會帶來任何副作用,幾乎所有方法都返回新的對象,不會修改原始數據對象。
如果原始數據有所改動,唯一的可能就是用戶顯式指定了要修改原始數據

