) map()函数:映射元素Pandas 库
数据分析三剑客:NumPy Pandas Matplotlib
一、Series
Series是一种类似于一维数组的对象由两部分组成
· index:相关的所居索引标签
· values:一组数据(ndarray类型)
1、创建
Series(data=None,index=None,dtype=None, name=None, copy=False, fastpath=False)
data:一组数据
index:索引(默认为 0,1,2,…)
name:这个对象的名字
注意:传入的索引要和数据对应,多传或少传会报错
1)简单直接创建
#直接传入一个列表即可创建,索引默认
>>> Series([1,2,3,4])
0 1
1 2
2 3
3 4
dtype: int64
#传入数据和索引
>>> Series(data=[1,2,3,4],index=['A','B','C','D'])
A 1
B 2
C 3
D 4
dtype: int64
#一般这样传入比较简单
>>> Series(data=[1,2,3,4],index=list('ABCD'))
2)字典形式创建
一般不这样创建,比较麻烦
>>> Series({
'A':1,"B":2,"C":3,"D":4})
A 1
B 2
C 3
D 4
dtype: int64
2、索引和切片
单个元素的索引与列表索引类似,返回单个索引类型
取多个索引,返回的是一个series类型
1)字符索引取值:
· 使用index中的元素作为索引值
· 使用 .loc[ ] 取值(推荐)
· 注意:字符索引是闭区间 [ start, end ]
2)数字索引取值:
· 使用整数作为索引值
· 使用 .iloc[ ] 取值(推荐)
· 注意:字符索引是左闭右开区间 [ start, end )
>>> s = Series(data=[1,2,3,4],index=list('ABCD'))
>>> s
A 1
B 2
C 3
D 4
dtype: int64
############ 索引 ######################
>>> s[0] #基础索引
1
>>> s.loc["A"] #字符索引
1
>>> s.iloc[0] #数字索引
1
############# 切片 ###################
>>> s[0:2] #基础切片(基础切片不能单个截取)
A 1
B 2
dtype: int64
>>> s.loc["A","C"] # 注意 !!! 这样指要获取最外层的 A 里面的 C 要
想获取 s 里的 A 和 C 这样
>>> s.loc[["A","C"]] #单个截取(字符索引)
A 1
C 3
dtype: int64
>>>> s.loc["A":"C"] #区间截取(字符索引)
A 1
B 2
C 3
dtype: int64
>>>> s.iloc[[0,3]] #单个截取(数字索引)
A 1
D 4
dtype: int64
>>> s.iloc[0:3] #区间截取(数字索引)
A 1
B 2
C 3
dtype: int64
3、Series的属性和方法
属性
1)形状 shape
2)个数 size
方法
1)查看前面 head()
s.head(n=5)
2)查看后面 tail()
s.head(n=5)
'''
n:取几个,默认为5个
'''
>>> s
A 1
B 2
C 3
D 4
dtype: int64
>>> s.head(2)
A 1
B 2
dtype: int64
>>> s.tail(2)
C 3
D 4
dtype: int64
3)求和
s.sum(axis=None,skipna=None,level=None,numeric_only=None, min_count=0, **kwargs)
'''
对于Series中的求和会将None会被自动转化为NAN,而且在计算时会自动将NAN转化为0
多维数组中的None在求和时会报错
'''
# Series 求和
>>> s2 = Series([1,2,3,None,np.NAN])
>>> s2
0 1.0
1 2.0
2 3.0
3 NaN
4 NaN
dtype: float64
>>> s2.sum()
6.0
# ndarray 求和
>>> nd = np.array([1,2,3,None,np.NAN])
>>> nd
array([1, 2, 3, None, nan], dtype=object)
>>> np.sum()
报错~~
4)isnull()/ notnull()
isnull()
功能:检测None / NaN,为空返回Ture,不为空返回False
>>> s2
0 1.0
1 2.0
2 3.0
3 NaN
4 NaN
dtype: float64
>>> s2.isnull()
0 False
1 False
2 False
3 True
4 True
dtype: bool
notnull()
功能:检测None / NaN,为空返回False,不为空返回Ture
>>> s2
0 1.0
1 2.0
2 3.0
3 NaN
4 NaN
dtype: float64
>>> s2.notnull()
0 True
1 True
2 True
3 False
4 False
dtype: bool
5)name属性
功能:来区分两个相同的数组
注意:在创建的时候设置了才有name属性,如果没有设置,则返回为空
6)unique()去重
>>> s1 = Series(['tom','lili','hehe','tom','lili'])
>>> s1
0 tom
1 lili
2 hehe
3 tom
4 lili
dtype: object
>>> s1.unique()
array(['tom', 'lili', 'hehe'], dtype=object)
4、Series的运算
1)Series的加减乘除
广播机制:给Series对象进行运算
>>> s
A 1
B 2
C 3
D 4
dtype: int64
#注意返回之后不会改变原数据的值
>>> s+1
A 2
B 3
C 4
D 5
dtype: int64
2)Series的运算
s.add(other,fill_value=None, axis=0)
'''
other:另一个Series
fill_value:相加是不对称的地方的NAN以这个值来填充
'''
>>> s1 = Series(data=np.random.randint(1,5,size=5),index=list('abcde'))
>>> s1
a 1
b 1
c 3
d 1
e 2
dtype: int32
>>> s2 = Series(data=np.random.randint(1,5,size=3),index=list('abc'))
>>> s2
a 2
b 3
c 1
dtype: int32
>>> s1.add(s2) #没有fill_value=0
a 3.0
b 4.0
c 4.0
d NaN
e NaN
dtype: float64
>>> s1.add(s2,fill_value=0) #有fill_value=0
a 3.0
b 4.0
c 4.0
d 1.0
e 2.0
dtype: float64
二、DataFrame
DataFrame是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(多个series共用同一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
行索引:index
列索引:columns
值:values(numpy的二维数组)
1、创建DataFrame
DataFrame(data=None, index=None,columns=None, dtype=None, copy=False)
1)一般创建方法
'''
data:数据
index:行索引(默认为 0,1,2....)
columns:列索引(默认为 0,1,2....)
注意:行索引和列索引要和所创建的数据维度对应!否则报错
'''
# 成绩表
nd = np.random.randint(0,150,size=(5,4))
nd = array([[125, 19, 45, 25],
[ 62, 128, 139, 2],
[ 99, 142, 134, 98],
[ 3, 114, 142, 102],
[ 47, 110, 70, 112]])
index=['张三','李四','王老五','赵六','田七']
columns = ['python','java','c','math']
df = DataFrame(data=nd,index=index,columns=columns)
df
2)字典创建方法
话不多说,上图
3)通过导入csv文件创建
文件内容:
DataFrame创建:
pd.read_csv(“文件路径“)
文件导入后会默认添加行索引。
疑问:csv文件导入到DataFrame后第一行是否一定是列索引?
2、DataFrame的属性
以上面创建的成绩表为 s 其中的数值不一样
1)values 值
返回值是一个多维数组
s.values
array([[100, 102, 50, 85],
[ 69, 136, 71, 100],
[129, 90, 18, 121],
[149, 87, 143, 129],
[ 40, 80, 129, 61]])
2)columns 列索引
s.index
Index(['张三', '李四', '王老五', '赵六', '田七'], dtype='object')
3)index 行索引
s.columns
Index(['python', 'java', 'c', 'math'], dtype='object')
4)shape 形状
行叫样本
列叫特征
s.shape
(5, 4) # 5 个样本,4 个特征
5)query 查询
>>> df1 = DataFrame({
'name':['tom','lucy','tom','peppy','lucy'],'age':[12,13,12,11,15]})
>>> df1
name age
0 tom 12
1 lucy 13
2 tom 12
3 peppy 11
4 lucy 15
>>> df1.query('name=="lucy"') #查询name是”lucy“的样本
name age
1 lucy 13
4 lucy 15
>>> df1.query('name=="lucy"&age>14') #查询name是lucy同时age大于 14的样本
name age
4 lucy 15
3-1、DataFrame的单层索引
以上面创建的成绩表为 s 其中的数值不一样
1)对列进行索引与切片
- 通过类似字典的方式
- 通过属性的方式
'''
返回值:一个Series对象
'''
s['python'] #通过字典的方式
张三 100
李四 69
王老五 129
赵六 149
田七 40
Name: python, dtype: int32
s.python #通过属性的方式
张三 100
李四 69
王老五 129
赵六 149
田七 40
Name: python, dtype: int32
2)对行进行索引
- 使用.loc[ ] 加index来进行行索引
- 使用.iloc[ ] 加整数来进行行索引
'''
返回值:一个Series对象
'''
s.loc['张三'] #使用.loc[] 索引
python 100
java 102
c 50
math 85
Name: 张三, dtype: int32
s.iloc[1] #使用.iloc[] 索引
python 69
java 136
c 71
math 100
Name: 李四, dtype: int32
3)对元素进行索引
- 使用列索引,再进行元素索引
- 使用行索引,再进行元素索引
- 使用整数数组形式的索引
- 取 任意顺序 的 任意元素
#使用列索引,再取元素值
s['python']
s['python'].loc['张三']
s['python'].iloc[0]
100
#使用行索引,再取元素值
s.loc['张三'<