本博客爲《利用Python進行數據分析》的讀書筆記,請勿轉載用於其他商業用途。
pandas對象裝配了一個常用數字、統計學方法的集合。其中大部分屬於歸約 或彙總統計 的類別,這些方法從DataFrame的行或列中抽取一個Series或一系列值的單個值(如總和或平均值)。與NumPy數組中的類似方法相比,他們內建了處理缺失值的功能。考慮一個小型DataFrame:
df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],
[np.nan, np.nan], [0.75, -1.3]],
index=['a', 'b', 'c', 'd'],
columns=['one', 'two'])
print(df)
#
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
調用DataFrame的sum
方法返回一個包含列上加和的Series:
print(df.sum())
#
one 9.25
two -5.80
dtype: float64
傳入axis='columns'
或axis=1
,則會將一行上各個列的值相加:
print(df.sum(axis='columns'))
#
a 1.40
b 2.60
c 0.00
d -0.55
dtype: float64
除非整個切片上(在本例中是行或列)都是NA,否則NA值是被自動排除的。可以通過禁用skipna
來實現不排除NA值:
print(df.mean(axis='columns', skipna=False))
#
a NaN
b 1.300
c NaN
d -0.275
dtype: float64
歸約方法可選參數
方法 | 描述 |
---|---|
axis | 規約軸,0爲行向,1爲列向 |
skipna | 排除缺失值,默認爲True |
level | 如果軸是多層索引的(MultiIndex),該參數可以縮減分組層級 |
一些方法,比如idxmin
和idxmax
,返回的是間接統計信息,比如最小值或最大值的索引值:
print(df.idxmax())
#
one b
two d
dtype: object
除了歸約方法外,有的方法是積累型 方法:
print(df.cumsum())
#
one two
a 1.40 NaN
b 8.50 -4.5
c NaN NaN
d 9.25 -5.8
還有一類方法既不是歸約型方法也不是累積型方法。describe
就是其中之一,它一次性產生多個彙總統計:
print(df.describe())
#
one two
count 3.000000 2.000000
mean 3.083333 -2.900000
std 3.493685 2.262742
min 0.750000 -4.500000
25% 1.075000 -3.700000
50% 1.400000 -2.900000
75% 4.250000 -2.100000
max 7.100000 -1.300000
對於非數值類型數據,describe
產生另一種彙總統計:
obj = pd.Series(['a', 'b', 'c', 'd'] * 4)
print(obj)
print(obj.describe())
#
0 a
1 b
2 c
3 d
4 a
5 b
6 c
7 d
8 a
9 b
10 c
11 d
12 a
13 b
14 c
15 d
dtype: object
count 16
unique 4
top a
freq 4
dtype: object
以下是彙總統計及其相關方法的完整列表。
描述性統計和彙總列表
方法 | 描述 |
---|---|
count | 非NA值的個數 |
describe | 計算Series或DataFrame各列的彙總統計集合 |
min,max | 計算最小值、最大值 |
argmin,argmax | 分別計算最小值、最大值所在的索引位置(整數) |
dixmin,idxmax | 分別計算最小值或最大值所在的索引標籤 |
quantile | 計算樣本的從0到1的分位數 |
sum | 加和 |
mean | 均值 |
median | 中位數(50%分位數) |
mad | 平均值的平均絕對偏差 |
prod | 所有值的積 |
var | 值的樣本方差 |
std | 值的樣本標準差 |
skew | 樣本偏度(第三時刻)值 |
kurt | 樣本峯度(第四時刻)值 |
cumsum | 累計值 |
cummin,cummax | 累計值的最小值或最大值 |
cumprod | 值的累計積 |
diff | 計算第一個算數差值(對時間序列有用) |
pct_change | 計算百分比 |
1. 相關性和協方差
略
2. 唯一值、計數和成員屬性
另一類相關的方法可以從一維Series包含的數值中提取信息。
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
uniques = obj.unique()
print(uniques)
#
['c' 'a' 'd' 'b']
唯一值並不一定按照排序好的順序返回,但是如果需要的話可以進行排序(uniques.sort()
)。相應地,value_count
計算Series包含的值的個數:
print(obj.value_counts())
#
a 3
c 3
b 2
d 1
dtype: int64
爲了方便,返回的Series會按照數量降序排序。value_counts
也是有效的pandas頂層方法,可以用於任意數組或序列:
print(pd.value_counts(obj.values, sort=True))
#
c 3
a 3
b 2
d 1
dtype: int64
isin執行向量化的成員屬性檢查,還可以將數據集以Series或DataFrame一列的形式過濾爲數據集的值子集:
print(obj)
#
0 c
1 a
2 d
3 a
4 a
5 b
6 b
7 c
8 c
dtype: object
mask = obj.isin(['b', 'c'])
print(mask)
#
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
dtype: bool
print(obj[mask])
#
0 c
5 b
6 b
7 c
8 c
dtype: object
與isin
相關的Index.get_indexer
方法,可以提供一個索引數組,這個索引數組可以將可能非唯一值數組轉換爲另一個唯一值數組:
to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
unique_vals = pd.Series(['c', 'b', 'a'])
print(pd.Index(unique_vals).get_indexer(to_match))
#
[0 2 1 1 0 2]
表:唯一值、計數和集合成員屬性方法
方法 | 描述 |
---|---|
isin | 計算表徵Series中每個值是否包含於傳入序列的布爾值數組 |
match | 計算數組中每個值的整數索引,形成一個唯一值數組。有助於數據對齊和join類型的操作 |
unique | 計算Series值中的唯一值數組,按照觀察順序返回 |
value_counts | 返回一個Series,索引是唯一序列值,值是計數個數,按照個數降序排序 |
某些情況下,我們可能想要計算DataFrame多個相關列的直方圖,如:
data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],
'Qu2': [2, 3, 1, 2, 3],
'Qu3': [1, 5, 2, 4, 4]})
print(data)
#
Qu1 Qu2 Qu3
0 1 2 1
1 3 3 5
2 4 1 2
3 3 2 4
4 4 3 4
將pandas.value_counts
傳入DataFrame的apply
函數可以得到:
result = data.apply(pd.value_counts).fillna(0)
print(result)
#
Qu1 Qu2 Qu3
1 1.0 1.0 1.0
2 0.0 2.0 1.0
3 2.0 2.0 0.0
4 2.0 0.0 2.0
5 0.0 0.0 1.0
這裏,結果中的行標籤是所有列中出現的不同值,數值則是這些不同值在每個列中出現的次數。