SeriesSeries的创建方式用列表创建(最常用)指定index(索引)用字典创建(非常常用)标量广播用Numpy数组创建Series常用属性indexvaluesndimshape sizedtype/dtypesname索引访问(重点)loc[] iloc[]at[] iat[] Series常用方法查看数据head(n)tail(n)判断&缺失值isin() 是否在某个集合里isna() 是否是缺失值统计计算sum() 求和mean() 平均值min()/max()var()/std()median()/mode()quantile(q)descrone() 一键统计计数/去重value_count() count()drop_duplicates() unique()nunique()排序&抽样sample()sort_index()sort_values()数据处理replace() 替换值to_frame()equals()keys()遍历Series的布尔索引条件筛选多条件筛选Series的运算与标量运算Series与Series运算
会自动创建一个0到N-1(N为数据的长度)的整数型索引0,1,2,3
41import pandas as pd2
3s = pd.Series([1, 2, 3, 4])4print(s)101s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])2print(s)3
4"""5结果 ⬇️6a 107b 208c 309dtype: int6410"""11s = pd.Series({'a': 1, 'b': 2, 'c': 3})81s = pd.Series(5, index=[0, 1, 2, 3])2"""30 541 552 563 57dtype: int648"""41import numpy as np2
3arr = np.array([1, 2, 3])4s = pd.Series(arr)其实这种方式和列表类似,但是底层更高效。
Series的索引对象,返回的是一个Index对象,是一个可迭代的对象,那么就可以用for 来遍历它
61arrs = pd.Series([11,22,33,44,55],name="atguigu",index=["a","b","c","d","e"])2# print(arrs)3# index Series的索引对象4print(arrs.index)5for i in arrs.index:6 print(i)Series的值,是一个ndarray数组
71arrs = pd.Series([11,22,33,44,55],name="atguigu",index=["a","b","c","d","e"])2print(arrs.values)3print(type(arrs.values))4"""5[11 22 33 44 55]6<class 'numpy.ndarray'>7"""Series的维度,永远是1,因为Series就是一维结构
21arrs = pd.Series([11,22,33,44,55],name="atguigu",index=["a","b","c","d","e"])2print(arrs.ndim)Series的形状,永远是(n,) ,因为是一维的,类似于Numpy,用元组表示
xxxxxxxxxx21arrs = pd.Series([11,22,33,44,55],name="atguigu",index=["a","b","c","d","e"])2print(arrs.shape) # (5,)Series的元素个数,和len()一样,有缺失值的话也统计
xxxxxxxxxx21arrs = pd.Series([11,22,33,44,55],name="atguigu",index=["a","b","c","d","e"])2print(arrs.size) # 5Series的元素类型,且Series里只能有一种dtype。在Series中,dtype和dtypes是一样的。
xxxxxxxxxx21arrs = pd.Series([11,22,33,44,55],name="atguigu",index=["a","b","c","d","e"])2print(arrs.dtype) # int64Series的名字,在DataFrame中,就会变成列名。
xxxxxxxxxx31arrs = pd.Series([11,22,33,44,55],name="atguigu",index=["a","b","c","d","e"])2arrs.name = "成绩"3print(arrs.name) # 成绩按照标签访问(也可以说是显示索引),如果是切片的话,一定记住,是两边都是闭区间。其实更像是dict 访问他的key,hhhhh
xxxxxxxxxx41s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])2
3print(s.loc['a']) # 104print(s.loc['a':'c']) # 包含右边!按照位置索引(也可以说是隐式索引),这里就和str 什么的一样了,都是左闭右开区间的,这里是和loc[] 这里不太一样的点。
xxxxxxxxxx31s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])2print(s.iloc[0]) # 103print(s.iloc[0:2]) # 不包含右边单标签访问(更快),只能取一个值,比loc更快
xxxxxxxxxx21s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])2print(s.at['a'])单个位置访问,比iloc[]更快
xxxxxxxxxx21s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])2print(s.iat[0])
查看前n行,就是快速看看数据长啥样,如果不写,默认是5行
xxxxxxxxxx101s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.head(5))3"""4a 11.05b 22.06c NaN7d NaN8e 44.09dtype: float6410"""看后n行,和head(n)类似,如果不写,默认是5行。但是也是从上往下显示的。
xxxxxxxxxx91s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.tail(5))3"""4b 22.05c NaN6d NaN7e 44.08f 22.09"""他会返回一个values 是 布尔类型的Series
xxxxxxxxxx111s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.isin([11,22]))3"""4a True5b True6c False7d False8e False9f True10dtype: bool11"""同样也是返回布尔类型的Series,来判断每一个value 是不是缺失值
xxxxxxxxxx111s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.isna())3"""4a False5b False6c True7d True8e False9f False10dtype: bool11"""求和,会自动忽略缺失值,有缺失值的话,都是float了
xxxxxxxxxx21s = pd.Series([1, 2, 3, 4, None])2print(s.sum()) # 10.0这里除的是有效值的数目,而不是长度,所以下面例子的值应该是2.5 而不是2
xxxxxxxxxx21s = pd.Series([1, 2, 3, 4, None])2print(s.mean()) # 2.5这里就是求最大最小值,不多赘述。
这里是方差和标准差,这里粘贴一个比较好的介绍:方差标准差
median(): 中位数,排序,最中间的一个或者两个
mode(): 众数,这里记得,可能会返回多个值
分位数,根据q去定
| q | 含义 |
|---|---|
| 0.5 | 中位数 |
| 0.25 | 下四分位 |
| 0.75 | 上四分位 |
返回常见的统计信息
count/mean/std/min/25%/50%/75%/max,也是一个Series
非常常用,每个值出现的次数
xxxxxxxxxx81s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.value_counts())3"""422.0 2511.0 1644.0 17Name: count, dtype: int648"""统计非空的数量,不包含NaN/None/...
xxxxxxxxxx21s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.count())去重(保留顺序)
打印出来的还是一个去除了重复项的Series,并且,缺失值都算一种
xxxxxxxxxx21s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.drop_duplicates())去重,不过返回的是一个ndarray
xxxxxxxxxx81s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.unique())3print(type(s.unique()))4
5"""6[11. 22. nan 44.]7<class 'numpy.ndarray'>8"""去重后元素的个数,不包含缺失值
xxxxxxxxxx21s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.nunique()) #3随机抽样,返回的也是一个Series
xxxxxxxxxx81s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.sample())3print(type(s.sample()))4"""5d NaN6dtype: float647<class 'pandas.Series'>8"""按照索引进行排序
xxxxxxxxxx111s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','a'])2print(s.sort_index())3"""4a 11.05a 22.06b 22.07c NaN8d NaN9e 44.010dtype: float6411"""
按照值进行排序,缺失值都在后面排着
xxxxxxxxxx111s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.sort_values())3"""4a 11.05b 22.06a 22.07e 44.08c NaN9d NaN10dtype: float6411"""xxxxxxxxxx111s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(s.replace(22,"hahahah"))3"""4a 11.05b hahahah6c NaN7d NaN8e 44.09a hahahah10dtype: object11"""转DataFrame
xxxxxxxxxx21s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2print(type(s.to_frame())) # <class 'pandas.DataFrame'>判断两个Series是否相等,必须index 和value 都相等才行
xxxxxxxxxx31arr1 = pd.Series([1,2,3])2arr2 = pd.Series([1,2,3])3print(arr1.equals(arr2)) # True和index属性一样的作用,返回一个Index对象,不过多赘述
和字典差不多
xxxxxxxxxx111s = pd.Series([11,22,np.nan,None,44,22],index=['a','b','c','d','e','f'])2for i, v in s.items():3 print(i,v)4"""5a 11.06b 22.07c nan8d nan9e 44.010f 22.011"""其实我觉得就是用True/False 去筛选数据的
假如我们要筛选出s中大于20的数据,那么我们的条件就应该写 s > 20
xxxxxxxxxx91s = pd.Series([10, 20, 30, 40])2print(s>20)3"""40 False51 False62 True73 True8dtype: bool9"""返回了一个Series,然后values 是布尔类型的数据,那么我们只需要把条件,放到中括号里,就是它的基本用法了,只保留了为True的数据,也是一个Series
xxxxxxxxxx71s = pd.Series([10, 20, 30, 40])2print(s[s > 20])3"""42 3053 406dtype: int647"""其实没有什么特别大的区别,就是把条件连接起来,不能用and 或者 or,必须用 &和 |,并且必须加括号。 这里必须需要注意 ,不然就报错!!!
xxxxxxxxxx61s = pd.Series([10, 20, 30, 40])2print(s[(s > 20) & (s < 40)])3"""42 305dtype: int646"""
xxxxxxxxxx101import pandas as pd2
3s = pd.Series([1, 2, 3])4print(s + 10)5"""60 1171 1282 139dtype: int6410"""会根据标签索引进行对位计算,索引没有匹配上的会用NaN填充。
xxxxxxxxxx111s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])2s2 = pd.Series([4, 5, 6], index=['b', 'c', 'd'])3
4print(s1 + s2)5"""6a NaN7b 6.08c 8.09d NaN10dtype: float6411"""