參考書目:《深入淺出Pandas:利用Python進行數據處理與分析》
pandas做簡單的描述性統計是很方便的,計算各種簡單的統計量,平均值,方差,中位數什麼的一般一兩天命令就能解決。
import pandas as pd
import numpy as np
df = pd.read_excel('https://www.gairuo.com/file/data/team.xlsx')
s = df.Q1 # 取其中一列,形成 Series
df.head() # 查看前五條數據
df.head(10) # 查看前10條數據
df.tail() # 查看後五條數據
df.tail(10) # 查看後10條數據
df.sample() # 隨機查看一條數據
df.sample(3) # 隨機查看3條數據
df.sample(10, random_state=0).reset_index(drop=True) # 隨機後重置索引
df.shape # (100, 6),共 100 行,6列 (索引不算)
s.shape # (100,) Series 只有一個值
df.info() ##基本信息
df.dtypes ##數據類型,如果是 Series 需要用 s.dtype
df.axes ## 行列索引內容 df.axes
df.index # RangeIndex(start=0, stop=100, step=1)
df.columns # 列索引,Series 不支持
df.values # 建議使用 to_numpy()
df.to_numpy() # numpy array(<所有值的列表矩陣>)
df.ndim # 2 維度數
df.size # 600 行x列的總數,就是總共有多少數據
# 是否為空,注意有空值不認為是空
df.empty # False
dfs.keys() # Series 的索引, DataFrame 的列名
df.first_valid_index() # 0 # 返回第一個非NA/空值的索引
df.last_valid_index() # 99 # 返回最後一個非NA/空值的索引
df.flags # 數據的標記信息(目前只支持是否重復標簽)pd 1.2.0+
# <Flags(allows_duplicate_labels=True)>
df.attrs={'info': '學生成績表'} # 設置元信息,可用於數據基礎信息描述
df.attrs # # 查看元信息 {'info': '學生成績表'}
# 標簽是否允許重復
df.flags["allows_duplicate_labels"]
df.flags.allows_duplicate_labels # True
df.set_flags(allows_duplicate_labels=False) # 設置
##Series 獨有的如下
s.name # 'Q1'
s.array # 值組成的數組 <PandasArray>
s.dtype # 類型,dtype('int64')
s.hasnans # False 是否有空
df.describe()
pd.Series(['a', 'b', 'c', 'c']).describe()
s2 = pd.Series([np.datetime64("2000-01-01"),np.datetime64("2010-01-01"),
np.datetime64("2010-02-01")])
s2.describe(datetime_is_numeric=True)
df.describe(percentiles=[.05, .25, .75, .95])#指定分位數
df.describe(include=[np.object, np.number]) # 指定類型
df.describe(exclude =[np.object]) # 排除類型
df.mean()#生成series,每列平均數
df.mean(1)# 每行平均值
df.mean(axis=1)# 每行平均值
df.mean(axis='columns')# 每行平均值
df.Q1.mean()#指定列
df.set_index('name').mean(1).head()
df.mean() # 返回所有列的均值
df.mean(1) # 返回所有行的均值,下同
df.corr() # 返回列與列之間的相關系數
df.count() # 返回每一列中的非空值的個數
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.abs() # 絕對值
df.median() # 返回每一列的中位數
df.std() # 返回每一列的標准差, 貝塞爾校正的樣本標准偏差
df.var() # 無偏方差
df.sem() # 平均值的標准誤差
df.mode() # 眾數
df.prod() # 連乘
df.mad() # 平均絕對偏差
df.cumprod() # 累積連乘,累乘
df.cumsum(axis=0) # 累積連加,累加
df.nunique() # 去重數量,不同值的量
df.idxmax() # 每列最大的值的索引名
df.idxmin() # 最小
df.cummax() # 累積最大值
df.cummin() # 累積最小值
df.skew() # 樣本偏度 (第三階)
df.kurt() # 樣本峰度 (第四階)
df.quantile() # 樣本分位數 (不同 % 的值)
###其他
# 很多支持指定行列(默認是 axis=0 列)等參數
df.mean(1) # 按行計算
# 很多支持
df.sum(0, skipna=False) # 否要排除缺失數據
# 很多支持
df.sum(level='blooded') # 索引級別
df.sum(level=0)
df.sum(min_count=1)# 執行加法操作所需要的最小有效值
df.sum(1, numeric_only=True)# 按行計算,只計算數字類型
# 可自定義相關性函數
def histogram_intersection(a, b):
v = np.minimum(a, b).sum().round(decimals=1)
return v
df = pd.DataFrame([(.2, .3), (.0, .6), (.6, .0), (.2, .1)],columns=['dogs', 'cats'])
df.corr(method=histogram_intersection)
df.all() # 返回所有列all()值的Series
df.any()
# 用表達式計算生成列。僅支持列,不是太安全
biaodashi='總成績='+'+'.join(df.columns[2:])
biaodashi2='平均成績=('+'+'.join(df.columns[2:])+')/3'
df.eval(biaodashi) #inplace=True,表示在原數據集上修改,生成新列
df.eval(biaodashi2,inplace=True) #inplace=True,表示在原數據集上修改,生成新列
# 四捨五入
df.round(2) # 指定字段指定保留小數位,如有
df.round({'Q1': 2, 'Q2': 0})
df.round(-1) # 保留10位
# 每個列的去重值的數量
df.nunique()
s.nunique() # 本列的去重值
# 真假檢測
df.isna() # 值的真假值替換
df.notna() # 與上相反
df + 1 # 等運算
df.add() # 加
df.sub() # 減
df.mul() # 乘
df.div() # 除
df.divmod() # 返回 (a // b, a % b)
df.truediv() # Divide DataFrames (float division).
df.floordiv() # Divide DataFrames (integer division).
df.mod() # 模,除後的余數
df.pow() # 指數冪
df.dot(df2) # 矩陣運算
# 不重復的值及數量
s.value_counts()
s.value_counts(normalize=True) # 重復值的頻率
s.value_counts(normalize=True)*100 # 當前值在序列中的百分比
s.value_counts(sort=False) # 不按頻率排序
s.unique() # 去重的值 array
s.is_unique # 是否有重復
# 最大最小值
s.nlargest() # 最大的前5個
s.nlargest(15) # 最大的前15個
s.nsmallest() # 最小的前5個
s.nsmallest(15) # 最小的前15個
s.pct_change() # 計算與前一行的變化百分比
s.pct_change(periods=2) # 前兩行
s1.cov(s2) # 兩個序列的協方差
df['Q1'].squeeze()
# 單值 DataFrame 和 Series 轉為標量
df.iloc[0, 2].squeeze() # 36
df.loc[df.index==5, ['name']].squeeze() # 'Harlie'