作者:xxw9485
时间:2018/3/10
来源:http://mp.weixin.qq.com/s/pm8503plIouWGAtS3zAM5Q
pandas 是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
序列(Series)可以理解成是R语言中的向量,Python中的列表、元组的高级版本。因为序列具有更好的广播效应,既可以与一个标量进行运算,又可以进行元素级函数的计算。而列表不能与标量进行运算,也不能用于元素级的数学函数。
实例:
# 输入:
a = [1,2,3] # 创建列表a
print(a + 10)
# 输出:
TypeError: can only concatenate list (not "int") to list
# 输入:
pow(a,2)
# 输出:
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
# 输入:
import pandas as pd
a = [1,2,3] # 创建列表a
b = pd.Series(a) # 将列表a转换为序列
b + 10
# 输出:
0 11
1 12
2 13
dtype: int64
# 输入:
pow(b,2)
# 输出:
0 1
1 4
2 9
dtype: int64
除了上面介绍序列功能,再来说说其他序列常用的场景,如序列的索引、成员关系、去重、排序、计数、抽样、统计运算等。
类似列表的索引方法:
# 输入:
import numpy as np
import pandas as pd
np.random.seed(1)
a = pd.Series(np.random.randint(size=5,low=1,high=10))
print(a,'\n')
print(a[0],'\n') # 取第一个元素
print(a[1:3],'\n') # 取第二、第三个元素
print(a[::2],'\n') # 依次取数,步长为2
# 输出:
0 6
1 9
2 6
3 1
4 1
dtype: int32
6
1 9
2 6
dtype: int32
0 6
2 6
4 1
dtype: int32
iat方法:该方法不管应用于序列还是数据框都非常优秀,主要体现在简介而高速。
# 输入:
import numpy as np
import pandas as pd
np.random.seed(1)
a = pd.Series(np.random.randint(size=5,low=1,high=10))
print(a,'\n')
print(a.iat[-3],'\n') # 取倒数第三个元素
# 输出:
0 6
1 9
2 6
3 1
4 1
dtype: int32
6
布尔索引:
# 输入:
import numpy as np
import pandas as pd
np.random.seed(1)
a = pd.Series(np.random.randint(size=5,low=1,high=100))
print(a,'\n')
print(a[a>=20]) # 取出大于等于20的值
print(a[a>=20][a<=70]) # 取出20到70之间的值
# 输出:
0 38
1 13
2 73
3 10
4 76
dtype: int32
0 38
2 73
4 76
dtype: int32
0 38
dtype: int32
在R语言中一个向量的元素是否包含于另一个向量,可以使用in函数进行判断,同理,Python中也有类似的方法。对于一个一维数组,in1d函数实现该功能;对于一个序列,isin方法可实现该功能。numpy模块中的in1d函数也可以用于序列的成员关系的比较。
注意:in1d函数第三个是数字1不是字母l。
# 输入:
import numpy as np
import pandas as pd
a = pd.Series([1,2,3,4])
b = pd.Series([10,2,3,40])
print(np.in1d(a,b),'\n')
print(a.isin(b),'\n')
c = np.array(['q','w','e','r'])
d = np.array(['q','a','w','s'])
print(np.in1d(c,d))
# 输出:
[False True True False]
0 False
1 True
2 True
3 False
dtype: bool
[ True True False False]
如果手中有一离散变量的序列,想查看该序列都有哪些水平,以及各个水平的频次,则可以借助于unique函数(与R语言一样的函数)实现序列的去重,获得不同的水平值;通过使用value_counts函数(对应于R语言的table函数)对各个水平进行计数,并按频次降序呈现。
# 输入:
import numpy as np
import pandas as pd
np.random.seed(10)
a = np.random.randint(size = 1000, low = 1, high = 4)
print(pd.unique(a),'\n') # 去重
print(pd.value_counts(a)) # 水平统计
# 输出:
[2 1 3]
3 342
2 334
1 324
dtype: int64
对某个序列进行升序或降序排序,注意:排序函数默认升序。
# 输入:
import numpy as np
import pandas as pd
np.random.seed(10)
a = pd.Series(np.random.normal(size = 4))
print(a.sort_index(ascending = False),'\n') # 按索引降序排列
print(a.sort_values()) # 按序列的实际值升序排列
# 输出:
3 -0.008384
2 -1.545400
1 0.715279
0 1.331587
dtype: float64
2 -1.545400
3 -0.008384
1 0.715279
0 1.331587
dtype: float64
抽样也是数据分析中常用的方法,通过从总体中抽取出一定量的样本来推断总体水平;或者通过抽样将数据拆分成两部分,一部分建模,一部分测试。pandas模块提供了sample函数(与R语言的sample函数一致)帮我们完成抽样的任务。
语法如下:
s.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
其中,n:指定抽取的样本量;
frac:指定抽取的样本比例;
replace:是否有放回抽样,默认无放回;
weights:指定样本抽中的概率,默认等概论抽样;
random_state:指定抽样的随机种子;
# 输入:
import pandas as pd
a = pd.Series(range(1,101)) # 从1到100随机抽取3个数
print(a.sample(n = 3, random_state = 2),'\n')
b = pd.Series(range(1,6)) # 从1到5有放回的抽取3个值
print(b.sample(n = 3, replace = True, random_state = 2),'\n')
c = pd.Series(['男','女']) # 从男、女中不等概率的抽取10个样本
print(c.sample(n = 10, replace = True, weights = [0.2,0.8],random_state = 3))
# 输出:
83 84
30 31
56 57
dtype: int32
0 1
0 1
3 4
dtype: int32
1 女
1 女
1 女
1 女
1 女
1 女
0 男
1 女
0 男
1 女
dtype: object
pandas模块提供了比numpy模块更丰富的统计运算函数,而且还提供了类似于R语言中的summary汇总函数,即describe函数。
# 输入:
import numpy as np
import pandas as pd
np.random.seed(10)
a = pd.Series(np.random.randint(size = 1000, low = 1, high = 101))
a.describe()
# 输出:
count 1000.000000
mean 50.406000
std 29.465834
min 1.000000
25% 24.000000
50% 50.000000
75% 76.000000
max 100.000000
dtype: float64
其中count是序列中非缺失元素的个数。哦,对了,如何判断一个序列元素是否为缺失呢?可以使用isnull函数,等同于R语言中的is.na函数。
# 输入:
import numpy as np
import pandas as pd
a = pd.Series([1,2,np.nan,4,np.nan,6])
print(a,'\n')
print(a.isnull())
# 输出:
0 1.0
1 2.0
2 NaN
3 4.0
4 NaN
5 6.0
dtype: float64
0 False
1 False
2 True
3 False
4 True
5 False
dtype: bool
除此,我们再来罗列一些常用的统计函数:
a.min() # 最小值
a.quantile(q=[0,0.25,0.5,0.75,1]) # 分位数函数
a.median() # 中位数
a.mode() # 众数
a.mean() # 平均值
a.mad() # 平均绝对误差
a.max # 最大值
a.sum() # 和
a.std() # 标准差
a.var() # 方差
a.skew() # 偏度
a.kurtosis() # 峰度
a.cumsum() # 和的累计,返回序列
a.cumprod() # 乘积的累积,返回序列
a.product() # 序列元素乘积
a.diff() # 序列差异(微分),返回序列
a.abs() # 绝对值,返回序列
a.pct_change() # 百分比变化 ,返回序列
a.corr(s2) # 相关系数
a.ptp() # 极差 R中的range函数