文章数据
收藏(次)
【python数据分析】第五章 pandas入门-3
import numpy as np
import pandas as pd
--------------------------------------------------------------------------------
arr = np.arange(12).reshape(3,4)
arr - arr[0] 输出:
array([[0, 0, 0, 0],
[4, 4, 4, 4],
[8, 8, 8, 8]])
numpy 中,二维数组 - 一维数组时,是二维数组的每一行数据分别减去哪个一维数组。
--------------------------------------------------------------------------------
pandas 也是这样的, DataFrame - Servier 也是这样的
frame = pd.DataFrame(np.arange(12).reshape((3, 4)),index=['r1', 'r2', 'r3'], columns=['c1', 'c2', 'c3', 'c4'])
frame - frame.iloc[0] 输出:
c1 c2 c3 c4
r1 0 0 0 0
r2 4 4 4 4
r3 8 8 8 8
默认情况下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,
然后沿着行一直向下广播
如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对
象就会被重新索引以形成并集
s = pd.Series([1,2,3,4,5], index = ['c1', 'c2', 'c3', 'c4', 'c5'])
frame + s 输出:
c1 c2 c3 c4 c5
r1 1 3 5 7 NaN
r2 5 7 9 11 NaN
r3 9 11 13 15 NaN
frame-s 输出:
c1 c2 c3 c4 c5
r1 -1 -1 -1 -1 NaN
r2 3 3 3 3 NaN
r3 7 7 7 7 NaN
--------------------------------------------------------------------------------
上面都是一行减去一个一维数组,那么怎么让每一列减去一个一维数组呢
frame.sub(frame['c2'], axis='index') # 使用方法,改变他的轴
传入的轴号就是希望匹配的轴。在本例中,我们的目的是匹配DataFrame的行索引
(axis='index' or axis=0)并进行广播
================================================================================
常用函数:
frame.abs() 绝对值,应用于全部元素上面的, frame 值会变化
np.abs(frame) 求绝对值, frame 值不变
frame.apply(fun) 参数是一个方法,或者 lambda, 在自定义 fun 的时候需要知道什么参数传入了
apple 这个方法执行调用 fun 传入的是一行数据 类型是:<class 'pandas.core.series.Series'>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 返回一个变量,可以的
def f(x):
return x.max() - x.min()
# 返回一个 Series 也行
def f2(x):
return pd.Series([x.max(), x.min(), x.max()-x.min()], index=['最大', '最小', '差值'])
def fun():
frame = pd.DataFrame(np.arange(12).reshape((3, 4)), index=['r1', 'r2', 'r3'], columns=['c1', 'c2', 'c3', 'c4'])
apply = frame.apply(f2, axis='columns')
print(apply)
fun()
输出:
最大 最小 差值
r1 3 0 3
r2 7 4 3
r3 11 8 3
--------------------------------------------------------------------------------
frame.applymap(fcell) # 参数函数一个回调方法,这个元素级别的,回调方法被调用后的参数是一个个元素
下面把每个元素 * 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
为什么叫 applymap 而不是 map呢 ?
因为 Series 中有 map 方法,DataFrame 中没有,
所以可以这样: apply = frame['c1'].map(fcell)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def fcell(x):
return x * 2
def fun():
frame = pd.DataFrame(np.arange(12).reshape((3, 4)), index=['r1', 'r2', 'r3'], columns=['c1', 'c2', 'c3', 'c4'])
apply = frame.applymap(fcell)
print(apply)
--------------------------------------------------------------------------------
排序:
arr= pd.Series(['2', '4', '-1', '3', '7'], index=['c', 'd', 'a', 'e', 'b'])
arr.sort_index()
arr.sort_values()
frame = pd.DataFrame(np.arange(12).reshape((3, 4)),
index=['r1', 'r3', 'r2'], columns=['c3', 'c1', 'c4', 'c2'])
frame.sort_index() # 行索引排序
frame.sort_index(axis=1) # 列索引排序
frame.sort_index(axis=1, ascending=False) # 列索引排序 并降序
对值排序:
frame.sort_values(by='r1', ascending=False, axis=1) # 参数 by 必须指定,by 指定还要和 axis 匹配才行
frame.sort_values(by=['c2', 'c1']) # 多列排序,前面相同的,后面的再排
--------------------------------------------------------------------------------
rank() 排序:
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
obj.rank() 输出:
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
这是什么鬼,排序怎么还出现了 6.5 4.5
rank() 并不是排序,而是测算一下某个数据应该放在哪个位置。因为是升序的,所以
有序是这样的:
原数据 -5 0 2 4 4 7 7 两个4, 两个7
原始评分 1 2 3 4 5 6 7 评分就是 1-N, rank默认是平均值算法,所以数据相同的要取位置平均值
平均评分 1 2 3 4.5 4.5 6.5 6.5 4+5/2 6 + 7/2
min 1 2 3 4 4 6 6 相同的使用最小的评分
max 1 2 3 5 5 7 7 相同的使用最大的评分
first 1 2 3 4 5 6 7 原始的哪个
dense 1 2 3 4 4 5 5 数据相同的为一组,按组评分,一组使用同一个评分
obj.rank(method='first') 输出: 这个就是原始评分
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
obj.rank(method='first', ascending=False) # 现在降序了,评分正好反过来
rank 的 method 取值: {'average', 'min', 'max', 'first', 'dense'}, default 'average'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DataFrame 的评分,默认是 一列一列的评分
frame.rank() # 每列评分
frame.rank(axis=1) # 每行评分
================================================================================
DataFrame 和 Series 可以有重复索引:
frame2 = pd.DataFrame(np.arange(12).reshape(3,4), index=['a', 'a', 'b'], columns=['c1','c1', 'c2', 'c2'])
frame2['c1'] 输出:
c1 c1
a 0 1
a 4 5
b 8 9
最好不要有重复的索引
================================================================================
pop = {
'c1':[1,2,3],
'c2':[np.nan, 5, 6],
'c3':[4, np.nan, 9]
}
frame = pd.DataFrame(pop)
frame 输出:
c1 c2 c3
0 1 NaN 4.0
1 2 5.0 NaN
2 3 6.0 9.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
frame.sum() # 每列计算和,得到一维 Series, 他会忽略 NAN 值
输出:
c1 6.0
c2 11.0
c3 13.0
dtype: float64
frame.sum(axis=1) # 按行计算
frame.sum(axis=1, skipna=False) # 不要忽略 NAN, 任何数据和NAN 运算都是 NAN
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
frame.idxmax() # 最大值索引 ,可选参数 axis skipna
frame.idxmin() # 最小值索引,可选参数 axis skipna
frame.cumsum() # 累加 ,可选参数 axis skipna
frame.describe() # 一次产生多个统计结果: 输出
c1 c2 c3
count 3.0 2.000000 2.000000
mean 2.0 5.500000 6.500000
std 1.0 0.707107 3.535534
min 1.0 5.000000 4.000000
25% 1.5 5.250000 5.250000
50% 2.0 5.500000 6.500000
75% 2.5 5.750000 7.750000
max 3.0 6.000000 9.000000
describe() 如果统计的不是数值类型的数据,他会有这样的统计
obj = pd.Series(['a', 'a', 'b', 'c'] * 4)
obj.describe()
count 16
unique 3
top a
freq 8
dtype: object
--------------------------------------------------------------------------------
方法汇总:
count frame.count() 非 Na 值的数量,axis
describe 各种统计
min, max 最小,最大
argmin, argmax 最大,最小值的索引位置,DateFrame 没有这个,Serier 有,返回位置
idxmin, idxmax 最大,最小值的索引
quantile 计算样本分位数
sum 总和
mean 均值
median 中位数
mad 根据平均值计算平均绝对离差
var 样本方差
std 标准差
skew 偏度(三阶矩)
kurt 峰度(四阶距)
cumsum 累加
cummin cummax 累加后最大最小
cumprod 累积
diff 一阶差分(时间序列很有用)
pct_change 百分数变化
--------------------------------------------------------------------------------
相关系数与协方差:不知道数据代表什么意思,以后研究
--------------------------------------------------------------------------------
唯一值、值计数以及成员资格
obj = pd.Series(list('aaccddbefffg'))
obj.unique() # 输出: array(['a', 'c', 'd', 'b', 'e', 'f', 'g'], dtype=object)
obj.value_counts() # 通过元素出现的个数,输出:
f 3
d 2
c 2
a 2
g 1
b 1
e 1
dtype: int64
isin 用于判断矢量化集合的成员资格,可用于过滤Series中或DataFrame列中数据的子集
mask = obj.isin(['b', 'c']) # 把 obj 每个元素都去判断一下,得到 bool series
obj[mask] 输出:
2 c
3 c
6 b
dtype: object
isin
match # 没有这个方法啊,是哪来的
unique
value_counts
分享
收藏
点赞人
举报
文章标签
评论列表