Python之Pandas庫(4)——描述性統計的概述與計算

本博客爲《利用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),該參數可以縮減分組層級

一些方法,比如idxminidxmax,返回的是間接統計信息,比如最小值或最大值的索引值:

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

這裏,結果中的行標籤是所有列中出現的不同值,數值則是這些不同值在每個列中出現的次數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章