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'])
df
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
df.sum() # 可以传入axis = 'columns' 或 1 ,对各列的值相加。
one 9.25
two -5.80
dtype: float64
# 除非操作的整行或整列都是 NA,否则NA的值都是自动排除的,可以通过禁用 skipna 来实现不排除NA 值。
df.mean(axis=1)
a 1.400
b 1.300
c NaN # 这里的两个都是 NA
d -0.275
dtype: float64
df.mean(axis=1,skipna=False)
a NaN # 有一个NA 就是啦
b 1.300
c NaN
d -0.275
dtype: float64
归约方法可选参数 | 描述 |
---|---|
axis | 归约轴,0为行,1为列 |
skipna | 排除缺失值,默认是 True |
level | 如果轴是多层索引的 ( MultiIndex) ,该参数可以缩减分组层级。。 |
df.idxmax() # 返回间接统计信息,比如这个最大值的索引
one b
two d
dtype: object
df.cumsum() # 积累型方法。积累列
one two
a 1.40 NaN
b 8.50 -4.5
c NaN NaN
d 9.25 -5.8
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
obj=pd.Series(['a','a','v','c']*4) # 对非数值类型的数据,产生另一种汇总统计。
obj.describe()
count 16
unique 3
top a
freq 8
dtype: object
一些汇总统计,比如这相关性和协方差,是由多个参数计算出来的。那么问题来了。。。什么是相关性和协方差呢脑补链接
series 的 corr 方法计算两个series 中重叠的,非NA 的,按索引对齐的值的相关性, cov 就是协方差
frame=pd.DataFrame({'b':[4.3,7,-3,2],'a':[0,1,0,1],'c':[-2,5,8,-2.5]})
frame
b a c
0 4.3 0 -2.0
1 7.0 1 5.0
2 -3.0 0 8.0
3 2.0 1 -2.5
frame['b'].corr(frame['a'])
0.5240763713323049
frame['b'].cov(frame['a'])
1.2833333333333332
frame.corr() # 对 dataframe 的corr cov 方法会分别以 dataframe 的形式返回相关性和协方差矩阵。
b a c
b 1.000000 0.524076 -0.369942
a 0.524076 1.000000 -0.194220
c -0.369942 -0.194220 1.000000
# 使用 dataframe 的corrwith 方法,可以计算出 dataframe 的行或列与另一个序列或 dataframe 的相关型。
# 该方法传入一个 series 方法时,会返回一个含有为每个列计算出来的相关性。
frame = pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon'])
frame.corrwith(frame['d'])
b -0.846939
d 1.000000
e 0.442531
dtype: float64
# 传入一个 dataframe 时,会计算匹配到列名的相关性数值,
frame.corrwith(np.abs(frame))
b 0.447732
d -1.000000
e -0.462654
dtype: float64 # 应该就是相同列名之间计算
frame2=frame.reindex(['b','d','a'],axis=1)
frame2
b d a
utah 0.492560 -1.186729 NaN
ohio -0.048141 0.148286 NaN
texas 1.347424 -0.626166 NaN
oregon 0.756698 0.098876 NaN
frame.corrwith(frame2)
frame.corrwith(frame2)
1
frame.corrwith(frame2)
b 1.0
d 1.0
a NaN
e NaN
dtype: float64
obj=pd.Series(['c','a','d','a','a','b','b','c','c'])
obj.unique() # 给出 series 中的唯一值
array(['c', 'a', 'd', 'b'], dtype=object) # 并不是按顺序的,如果需要使用 .sort()
obj.value_counts() # 这个返回 series 包含的值的个数
a 3
c 3
b 2 # 返回的 按找数量排序
d 1 # 等价于 pd.value_counts(obj.values) 这是一个顶层方法。
dtype: int64
# isin 执行向量化的成员属性检擦,还可以将数据集以sereis dataframe 一列的形式过滤为数据集的子集
mask=obj.isin(['b','c'])
mask
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
dtype: bool
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'])
pd.Index(unique_vals).get_indexer(to_match)
array([0, 2, 1, 1, 0, 2], dtype=int64) # c 0 b 1 a 2 。。。这就很迷
# 计算 dataframe 多个相关列的直方图
data=pd.DataFrame({'qu1':[1,2,4,3,4],'qu2':[2,3,1,2,3],'qu3':[1,5,2,4,4]})
data
qu1 qu2 qu3
0 1 2 1
1 2 3 5
2 4 1 2
3 3 2 4
4 4 3 4
data.apply(pd.value_counts).fillna(0)
qu1 qu2 qu3
1 1.0 1.0 1.0
2 1.0 2.0 1.0
3 1.0 2.0 0.0
4 2.0 0.0 2.0 # 这些行标签就是所有列中出现的不同值,数值就是这些不同值在每个列中出现的次数
5 0.0 0.0 1.0