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 方法修改數據不會帶來任何副作用,幾乎所有方法都返回新的對象,不會修改原始數據對象。
如果原始數據有所改動,唯一的可能就是用戶顯式指定了要修改原始數據