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
还有几个非常重要的方法:
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
纠正:表格中std,是标准差,不是标案差。