pandas 排序方法和統計函數


一、排序和排名

排序分兩種:根據索引排序和根據元素值排序。

根據索引排序使用的是sort_index方法,它返回一個新的排好序的對象:

In [103]: s = pd.Series(range(4),index = list('dabc')) In [104]: s Out[104]: d 0 a 1 b 2 c 3 dtype: int64 In [105]: s.sort_index() # 根據索引的字母序列排序
Out[105]: a 1 b 2 c 3 d 0 dtype: int64 In [108]: df = pd.DataFrame(np.random.randint(10,size=(4,3)), columns=list('edb'),index = ['two','one','five','four']) In [109]: df Out[109]: e d b two 7  6  1 one 5  6  8 five 8  4  1 four 7  0  3 In [110]: df.sort_index() # 默認按行索引排序,並以字母順序
Out[110]: e d b five 8  4  1 four 7  0  3 one 5  6  8 two 7  6  1 In [111]: df.sort_index(axis=1)  # 指定按列排序
Out[111]: b d e two 1  6  7 one 8  6  5 five 1  4  8 four 3  0  7 In [112]: df.sort_index(axis=1,ascending=False)  # 默認升序,可以指定為倒序
Out[112]: e d b two 7  6  1 one 5  6  8 five 8  4  1 four 7  0  3

如果要根據某行或某列元素的值的大小進行排序,就要使用sort_values方法:

In [113]: s= pd.Series([4, 7,-3,2]) In [114]: s.sort_values() Out[114]: 2   -3
3    2 0 4
1    7 dtype: int64 # np.nan缺失值會自動排到最后
In [115]: s2 = pd.Series([4, np.nan,7,np.nan,-3,2]) In [116]: s2 Out[116]: 0 4.0
1 NaN 2    7.0
3 NaN 4   -3.0
5    2.0 dtype: float64 In [117]: s2.sort_values() Out[117]: 4   -3.0
5    2.0 0 4.0
2    7.0
1 NaN 3 NaN dtype: float64 In [118]: df2 = pd.DataFrame({'b':[4,7,-3,2], 'a':[0,1,0,1]}) In [120]: df2 Out[120]: b a 0 4 0 1  7  1
2 -3 0 3  2  1 In [121]: df2.sort_values(by='b')  # 根據某一列里的元素值進行排序
Out[121]: b a 2 -3 0 3  2  1 0 4 0 1  7  1 In [122]: df2.sort_values(by=['a','b']) # 根據某些列進行排序
Out[122]: b a 2 -3 0 0 4 0 3  2  1
1  7  1

除了排序,還有排名。Pandas的排名規則不太好理解,其規則如下:

  1. 以升序排名為例
  2. 所有數中最小的數排為1.0
  3. 按數大小依此類推,2.0、3.0、4.0給安排位次
  4. 如果有重復的數,則重復的排名相加除以重復的個數,得出一個排名
  5. 重復的數后面的排名,接着排

比如下面的例子:

In [123]: s = pd.Series([7,-5,7,4,2,0,4]) In [124]: s.rank() Out[124]: 0 6.5
1    1.0
2    6.5
3    4.5
4    3.0
5    2.0
6    4.5 dtype: float64
  • -5最小,給排名1.0
  • 0其次,排2.0
  • 2再次,排3.0
  • 有2個4,於是4.0+5.0等於9,再除個數2,最終排名4.5。4.0和5.0兩個排名並未使用。
  • 又有2個7,於是6.0+7.0等於13,再除2,最后排名6.5

也可以根據觀察順序進行排名位次分配,主要是重復的數,按順序先后給排名,揣摩一下就能明白規律:

In [125]: s.rank(method='first') Out[125]: 0 6.0
1    1.0
2    7.0
3    4.0
4    3.0
5    2.0
6    5.0 dtype: float64

還可以按最大值排名,並降序排列:

In [126]: s.rank(method='max',ascending=False) Out[126]: 0 2.0
1    7.0
2    2.0
3    4.0
4    5.0
5    6.0
6    4.0 dtype: float64

DataFrame則可以根據行或列計算排名:

In [128]: df = pd.DataFrame(np.random.randint(-10,10,(4,3)),columns=list('abc')) In [129]: df Out[129]: a b c 0 -9 -1 -8
1 -10  8 -7
2  -4  2  6
3   9 -2 -7 In [130]: df.rank(axis='columns') Out[130]: a b c 0 1.0  3.0  2.0
1  1.0  3.0  2.0
2  1.0  2.0  3.0
3  3.0  2.0  1.0

下面列出了method參數可以使用的排名方法:

  • average:默認方式,計算平均排名
  • min:最小排名
  • max:最大排名
  • first:觀察順序排名
  • dense:類似min,但組間排名總是增加1

二、統計和匯總

Pandas也有一套和Numpy類似的數學、統計學方法。不過在使用中要注意的是,Numpy通常將數組看作一個整體,而Pandas通常對列進行操作。當然,這兩者也能單獨對行進行操作。另外,Pandas內建了處理缺失值的功能,這一點是numpy不具備的。

In [131]: df = pd.DataFrame([[1.4, np.nan],[7.1,-4.2],[np.nan,np.nan],[0.75,-1.1]],index=list('abcd'),columns=['one','two']) In [132]: df Out[132]: one two a 1.40 NaN b 7.10 -4.2 c NaN NaN d 0.75 -1.1 In [133]: df.sum() # 默認對列進行求和,並返回一個Series對象,缺失值默認被忽略
Out[133]: one 9.25 two -5.30 dtype: float64 In [134]: df.sum(axis='columns') # 指定對行進行求和
Out[134]: a 1.40 b 2.90 c 0.00 d -0.35 dtype: float64 In [135]: df.mean(axis='columns', skipna=False) # 對行求平均值,但不忽略缺失值
Out[135]: a NaN b 1.450 c NaN d -0.175 dtype: float64

下面是主要的統計和匯總方法:

方法 描述
min 最小值
max 最大值
idxmin 返回某行或某列最小值的索引
idxmax 最大值的索引
cumsum 累加
cumprod 累乘
count 統計非NaN的個數
describe 匯總統計集合
quantile 計算樣本的從0到1間的分位數
sum 求和
mean 平均值
median 中位數(50%)
mad 平均值的平均絕對偏差
prod 所有值的積
var 方差
std 標案差
skew 樣本偏度,第三時刻值
kurt 樣本峰度,第四時刻值
diff 計算第一個算術差值
pct_change 計算百分比
In [136]: df.idxmax() Out[136]: one b two d dtype: object In [137]: df.idxmin() Out[137]: one d two b dtype: object In [138]: df.cumsum() Out[138]: one two a 1.40 NaN b 8.50 -4.2 c NaN NaN d 9.25 -5.3 In [139]: df.cumprod() Out[139]: one two a 1.400 NaN b 9.940 -4.20 c NaN NaN d 7.455  4.62 In [144]: df.count() Out[144]: one 3 two 2 dtype: int64

最重要的describe方法:

In [140]: df.describe() Out[140]: one two count 3.000000  2.000000 mean 3.083333 -2.650000 std 3.493685  2.192031 min 0.750000 -4.200000
25%    1.075000 -3.425000
50%    1.400000 -2.650000
75%    4.250000 -1.875000 max 7.100000 -1.100000 In [141]: s=pd.Series(list('aabc'*4)) In [143]: s.describe()  # 對於非數值型,統計類型不一樣
Out[143]: count 16 unique 3 top a freq 8 dtype: object

還有幾個非常重要的方法:

  • unique:計算唯一值數組,並按觀察順序返回
  • value_counts:計數,並按多到少排序
  • isin:判斷是否包含成員
In [147]: s = pd.Series(list('cadaabbcc')) In [149]: uniques = s.unique() # 獲取去重后的值 In [150]: uniques  # 這是一個array數組
Out[150]: array(['c', 'a', 'd', 'b'], dtype=object) In [151]: s.value_counts() # 計數,默認從多到少排序
Out[151]: a 3 c 3 b 2 d 1 dtype: int64 In [152]: pd.value_counts(s, sort=False) # 也可以這么調用,並且不排序
Out[152]: d 1 c 3 a 3 b 2 dtype: int64 In [155]: mask = s.isin(['b','c'])  # 判斷Series的元素在不在b和c里面 In [156]: mask # 這是一個bool類型
Out[156]: 0 True 1 False 2 False 3 False 4 False 5 True 6 True 7 True 8 True dtype: bool In [157]: s[mask] Out[157]: 0 c 5 b 6 b 7 c 8 c dtype: object


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM