Pandas_基础_全
Pandas基础(全)
引言
Pandas是基于Numpy的库,但功能更加强大,Numpy专注于数值型数据的操作,而Pandas对数值型,字符串型等多种格式的表格数据都有很好的支持。
关于Numpy的基础知识,请查看 Numpy基础(全)
内容介绍
1.数据结构(Series,DataFrame)
2.索引对象
3.索引操作
4.数据运算
5.层次化索引
6.可视化(暂时忽略)
一,数据结构
Pandas 采用了很多Numpy的代码风格,但Pandas是用来处理表格型或异质性数据的,而Numpy更适合处理同质型的数值类数组数据。
Pandas数据结构:Series 和 DataFrame
<1> Series
# Series 是一种一维的数组型对象,它包含了一个值序列(与 Numpy 中的类型相似),并且包含了数据标签,称为索引。
# 事实上纯数值型的Series对象的values属性就是一个Numpy数组。
# 最简单的序列可以仅仅由一个数组构成:
import pandas as pd
import numpy as np
obj = pd.Series([4,7,-5,3])
obj
# print(obj) # 打印效果和直接输出obj 效果一样
0 4
1 7
2 -5
3 3
dtype: int64
# 在交互式环境中,Series 的字符串表示为:索引在左边,值在右边。
# 1, 默认索引从0开始,可以通过 index属性 和 values属性分别获得Series对象的索引和值:
obj = pd.Series([4,7,-5,3])
obj.index # 与range(4)类似
RangeIndex(start=0, stop=4, step=1)
obj.values
array([ 4, 7, -5, 3], dtype=int64)
# 2, 可以自定义索引来替换默认索引:
obj2=pd.Series([4,7,-5,3],index=['d','b','a','c'])
# obj2.values
# obj2.index
obj2['a']
-5
# 可以使用 Series_obj.index属性,按位置赋值来改变索引:
obj2.index=['m','b','f','d']
obj2
m 4
b 7
f -5
d 3
dtype: int64
# 3, 对Series对象使用 Numpy 函数或 Numpy 风格的各种操作(如根据布尔型数组进行过滤,与标量相乘,或者应用数学函数),
# 都会保留索引与值之间的连接关系。
obj2[obj2>0] #以布尔型数组进行索引
d 4
b 7
c 3
dtype: int64
obj2*2
d 8
b 14
a -10
c 6
dtype: int64
np.exp(obj2) # 计算各元素的以e为底的指数
d 54.598150
b 1096.633158
a 0.006738
c 20.085537
dtype: float64
# 4, 也可以把 Series 看作是一种长度固定且有序的字典,因此在可能会使用字典的上下文中,使用Series来代替字典也是一个好主意。
print('Yes') if 'b' in obj2 else print('No')
print('Yes') if 'e' in obj2 else print('No')
Yes
No
# 5, 如果你已经将数据存放在了Python的字典中,你也可以使用字典来生成一个Series对象:
sdata={'Ohio':35000,'texas':71000,'Oregon':16000,'Utah':1000}
obj3=pd.Series(sdata) # 产生一个按【键】排好序的字典。
obj3
Ohio 35000
texas 71000
Oregon 16000
Utah 1000
dtype: int64
# 当然,也可以对键重新定义,当新定义的键在原字典中不存在时,Series处理这个缺失值为NaN。
# 当原来的字典中的键不存在于新定义的索引列表中时,这个键值对就会被排除掉。
obj4=pd.Series(sdata,index=["Tom",'Ohio','Ivan','Utah'])
obj4
Tom NaN
Ohio 35000.0
Ivan NaN
Utah 1000.0
dtype: float64
# 6, 检验缺失数据:
# pd.isnull(Series_obj) pd.notnull(Series_obj) 等同于 Series_obj.isnull() Series_obj.notnull() 返回布尔类型 Series对象:
# 既可以作为pandas的顶层函数,也可以作为 Series实例对象调用的方法。
# 在后面的章节中会深入的讨论如何处理缺失数据。
# pd.isnull(obj4)
obj4.isnull()
Tom True
Ohio False
Ivan True
Utah False
dtype: bool
# pd.notnull(obj4)
pd.notnull(obj4)
Tom False
Ohio True
Ivan False
Utah True
dtype: bool
# 7, Series的索引自动对齐:
# 因为上面的obj3和obj4有部分索引是一样的,所以我们对这两个Series对象进行操作:
# Series的索引自动对齐功能和数据库的join操作是很相似的。
obj3+obj4
Ivan NaN
Ohio 70000.0
Oregon NaN
Tom NaN
Utah 2000.0
texas NaN
dtype: float64
# 8, Series_obj.name 属性和 Series_obj.index.name 属性:
# 可以修改这两个属性(默认为None),他们往往和pandas的其他重要功能集成在一起。
print(obj4.name)
print(obj4.index.name)
obj4.name="population" # 人口
obj4.index.name="state" # 州
obj4
None
None
state
Tom NaN
Ohio 35000.0
Ivan NaN
Utah 1000.0
Name: population, dtype: float64
# 9, 按索引改变 Series对象的元素值:
# obj = pd.Series([4,7,-5,3],index=['Bob','Steve','Jeff','Ryan'])
obj = pd.Series([4,7,-5,3])
obj.index=['Bob1','Steve1','Jeff1','Ryan1']
obj['Steve1']=10
obj
Bob1 4
Steve1 10
Jeff1 -5
Ryan1 3
dtype: int64
<2> DataFrame
# DataFrame表示矩阵数据表,包含已经排序的列集合,每一列可以是不同的值类型(数值,字符串,布尔值等)。
# 既有行索引,也有列索引。
# 可以被视为共享相同索引的 Series的字典。
# 数据被存储为一个以上的二维块,而不是列表,字典或其他一维数组的集合。
# Note: 尽管 DataFrame是二维的,但可以利用分层索引在DataFrame中展现更高维度的数据。分层索引是pandas中一种更为高级的数据处理特性。
# DataFrame 既可以创建而来,也可以由其他数据类型转化而来。
# 1,创建 DataFrame
# 1)创建 DataFrame:
# 给 pd.DataFrame()传入由长度相等的列表,数组或元组组成的字典,创建DataFrame 对象.
# 字典的键位 DataFrame的列索引。
# DataFrame 构造函数的有效输入:
# 二维数组 2d ndarray 数据矩阵,行列的索引标签是可选参数 1-10)
# 数组,列表,元组,序列构成的字典 每个序列成为 DataFrame 的一列,所有的序列必须长度相等 1-1)至 1-5)
# Numpy 结构化/记录化数组 与数组构成的字典一致
# Series 构成的字典 每个 Series为一列,Series的索引合并为行索引,也可以显式的传递索引 1-1)至 1-4)
# 字典构成的字典(嵌套字典) 每一个内部字典形成一列,键联合起来形成结果的行索引 1-6)
# 字典或Series构成的列表 列表中的一个元素形成 DataFrame的一行,字典的键 或Series索引联合起来形成 DataFrame的列标签 1-8)1-9)
# 列表或元组构成的列表 与 2d ndarray的情况一致 1-7)
# 其他DataFrame 如果不显式传递索引,则会使用原 DataFrame 的索引
# Numpy MaskedArray 与 2d ndarray的情况类似,但隐藏值会在结果DataFrame 中成为 NA/缺失值
# 1-1) pd.DataFrame(dict_ndarrayvalu)
from pandas import Series,DataFrame
import pandas as pd
import numpy as np
data={
'name':np.array(['张三','李四','王五','小明']),
'sex':np.array(['female','female','male','male']),
'year':np.array([2001,2001,2003,2002]),
'city':np.array(['北京','上海','广州','深圳'])
}
df=DataFrame(data)
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
# 1-2)pd.DataFrame(dict_listvalue)
data1={
'name':['张三','李四','王五','小明'],
'sex':['female','female','male','male'],
'year':[2001,2001,2003,2002],
'city':['北京','上海','广州','深圳']
}
df1=DataFrame(data1)
df1
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
# 1-3)pd.DataFrame(dict_tuplevalue)
data1={
'name':('张三','李四','王五','小明'),
'sex':('female','female','male','male'),
'year':(2001,2001,2003,2002),
'city':('北京','上海','广州','深圳')
}
df1=DataFrame(data1)
df1
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
# 1-4)pd.DataFrame(dict_Seriesvalue)
data2={
'name':pd.Series(['张三','李四','王五','小明']),
'sex':pd.Series(['female','female','male','male']),
'year':pd.Series([2001,2001,2003,2002]),
'city':pd.Series(['北京','上海','广州','深圳'])
}
df02=DataFrame(data2)
df02
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
# 1-5)pd.DataFrame(dict_mixvalu)
data3={
'name':np.array(['张三','李四','王五','小明']),
'sex':('female','female','male','male'),
'year':[2001,2001,2003,2002],
'city':pd.Series(['北京','上海','广州','深圳'])
}
df03=DataFrame(data3)
df03
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
# 1-6) 使用嵌套字典的数据也可以创建 DataFrame 数据: 外层字典的键为列索引,内层字典的键为行索引
data2={
'sex':{'张三':'female','李四':'female','王五':'male'},
'city':{'张三':'北京','李四':'上海','王五':'广州'}
}
# df02=DataFrame(data2,index=['老大','李四','王五']) # 也可以这样显式地指定行/列索引的顺序或改变行/列数据。
df02=DataFrame(data2,index=['老大','李四','王五'],columns=['sex','city','newcolumn'])
df02
{ vertical-align: top }
.dataframe thead th { text-align: right }
sex | city | newcolumn | |
---|---|---|---|
老大 | NaN | NaN | NaN |
李四 | female | 上海 | NaN |
王五 | male | 广州 | NaN |
# 1-7) 使用列表或元组构成的嵌套列表创建 DataFrame 数据 ,每个内层列表/元组就是一行数据 行,列索引由 DataFrame()提供
# data = [['Alex',10],['Bob',12],['Clarke',13]]
import pandas as pd
data = [('Alex',10),('Bob',12),('Clarke',13)]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
Name | Age | |
---|---|---|
0 | Alex | 10.0 |
1 | Bob | 12.0 |
2 | Clarke | 13.0 |
# 1-8) 使用字典列表创建 DataFrame 数据 ,每个字典都包含了列标签(键)的一行数据(值)
data = [{'name':'Alex','age':10},{'name':'Bob','age':12},{'name':'Clarke','age':13}]
df = pd.DataFrame(data,dtype=float)
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | age | |
---|---|---|
0 | Alex | 10.0 |
1 | Bob | 12.0 |
2 | Clarke | 13.0 |
# 1-9) 使用Series对象创建 DataFrame 数据,每个Series都包含了列标签(index)的一行数据(值)
data = [pd.Series(['Alex',10],index=['Name','Age']),pd.Series(['Bob',12],index=['Name','Age']),pd.Series(['Clarke',13],index=['Name','Age'])]
df = pd.DataFrame(data,dtype=float)
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
Name | Age | |
---|---|---|
0 | Alex | 10.0 |
1 | Bob | 12.0 |
2 | Clarke | 13.0 |
# 1-10) 使用 2dndarray 创建 DataFrame 数据:
arr2d=np.array([['Alex',10],['Bob',12],['Clarke',13]])
df = pd.DataFrame(arr2d,columns=['name','age']) # 使用 2dndarray 创建 DataFrame 数据,不能指定 dtype=float,会报错
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | age | |
---|---|---|
0 | Alex | 10 |
1 | Bob | 12 |
2 | Clarke | 13 |
# 2,可以通过 columns和 index 属性来查看列和行:
df02.columns
Index(['sex', 'city'], dtype='object')
df02.index
Index(['老大', '李四', '王五'], dtype='object')
# 3,DataFrame的指定列索引列表,对列索引进行排序:
# 虽然上面的df都是按创建时的code 顺序对列进行排列的,但由于字典是无序的,所以为了安全起见,我们创建DataFrame时手动指定\修改 列的顺序:
from pandas import DataFrame
import numpy as np
data={
'name':np.array(['张三','李四','王五','小明']),
'sex':np.array(['female','female','male','male']),
'year':np.array([2001,2001,2003,2002]),
'city':np.array(['北京','上海','广州','深圳'])
}
df02=DataFrame(data,columns=['name','year','sex','city']) # 语法
df02
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | year | sex | city | |
---|---|---|---|---|
0 | 张三 | 2001 | female | 北京 |
1 | 李四 | 2001 | female | 上海 |
2 | 王五 | 2003 | male | 广州 |
3 | 小明 | 2002 | male | 深圳 |
# 4,指定行索引列表(没有指定行索引的情况下,默认的行索引是从0到N-1(N为数据长度))
df03=DataFrame(data,columns=['name','year','sex','city'],index=['a','b','c','d']) # 语法
df03
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | year | sex | city | |
---|---|---|---|---|
a | 张三 | 2001 | female | 北京 |
b | 李四 | 2001 | female | 上海 |
c | 王五 | 2003 | male | 广州 |
d | 小明 | 2002 | male | 深圳 |
# 当指定的【列】索引在传入的data字典中不存在时,将会以缺失值NaN处理:
# 如果少指定了某列,生成的DataFrame对象就不含此列数据。
# 注意,如果多指定了行或少指定了行,就会报错。
df03=DataFrame(data,columns=['name','year','sex','city','job'],index=['a','b','c','d']) # 语法
df03
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | year | sex | city | job | |
---|---|---|---|---|---|
a | 张三 | 2001 | female | 北京 | NaN |
b | 李四 | 2001 | female | 上海 | NaN |
c | 王五 | 2003 | male | 广州 | NaN |
d | 小明 | 2002 | male | 深圳 | NaN |
# 5,对 DataFrame的行和列进行索引:
# 5-1)索引 DataFrame 的列返回 Series对象:
# Dataframe_obj[column] 或 Dataframe_obj.column 返回的结果为 Series 对象
# 返回的 Series对象与 DataFrame对象有相同的索引,且 Series的name 属性也会被合理的设置:
df04=DataFrame(data,columns=['name','year','sex','city','job'],index=['张','李','王','马'])
df04['sex']
张 female
李 female
王 male
马 male
Name: sex, dtype: object
sex=df04.sex
sex
张 female
李 female
王 male
马 male
Name: sex, dtype: object
# 5-2) 索引 DataFrame 的行返回 Series对象:
# 注意语法: dataframe_obj.loc[line_index] # DataFrame对象的特殊属性 loc
df04.loc['李']
name 李四
year 2001
sex female
city 上海
job NaN
Name: 李, dtype: object
# 5-3)通过列索引修改/赋值/创建 此列元素:
df04['job']='Data Analysis' # 将一个值赋值给一列
df04
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | year | sex | city | job | |
---|---|---|---|---|---|
张 | 张三 | 2001 | female | 北京 | Data Analysis |
李 | 李四 | 2001 | female | 上海 | Data Analysis |
王 | 王五 | 2003 | male | 广州 | Data Analysis |
马 | 小明 | 2002 | male | 深圳 | Data Analysis |
df04['job']=np.arange(4.) # 将一个与列等长度的ndarray数组赋值给一列
df04
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | year | sex | city | job | |
---|---|---|---|---|---|
张 | 张三 | 2001 | female | 北京 | 0.0 |
李 | 李四 | 2001 | female | 上海 | 1.0 |
王 | 王五 | 2003 | male | 广州 | 2.0 |
马 | 小明 | 2002 | male | 深圳 | 3.0 |
df04['job']=['Data Analysis']*4 # 将一个与列等长度的列表赋值给一列
df04
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | year | sex | city | job | |
---|---|---|---|---|---|
张 | 张三 | 2001 | female | 北京 | Data Analysis |
李 | 李四 | 2001 | female | 上海 | Data Analysis |
王 | 王五 | 2003 | male | 广州 | Data Analysis |
马 | 小明 | 2002 | male | 深圳 | Data Analysis |
val=pd.Series(['Data Analysis dev','Data Analysis im','Data Analysis ba'],index=['马','李','张'])
df04['job']=val # 将一个长度<=列长度的 Series对象赋值给一列, 缺失值处理为NAN,按照 DataFrame的索引排列
df04
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | year | sex | city | job | |
---|---|---|---|---|---|
张 | 张三 | 2001 | female | 北京 | Data Analysis ba |
李 | 李四 | 2001 | female | 上海 | Data Analysis im |
王 | 王五 | 2003 | male | 广州 | NaN |
马 | 小明 | 2002 | male | 深圳 | Data Analysis dev |
val=pd.Series(['band 6A','band 8B','band 7B'],index=['马','李','王'])
df04['band']=val # 如果列索引并不存在,创建一个新的列。(无论赋值的内容是列表,Series或值)
df04
# 说明了 从 DataFrame里选取的列是数据的视图,不是拷贝。对 Series的修改会映射到 DataFrame里。
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | year | sex | city | job | band | |
---|---|---|---|---|---|---|
张 | 张三 | 2001 | female | 北京 | Data Analysis ba | NaN |
李 | 李四 | 2001 | female | 上海 | Data Analysis im | band 8B |
王 | 王五 | 2003 | male | 广州 | NaN | band 7B |
马 | 小明 | 2002 | male | 深圳 | Data Analysis dev | band 6A |
# 6,del 关键字 删除DataFrame的列
# 像字典中删除键一样
data={
'name':np.array(['张三','李四','王五','小明']),
'sex':np.array(['female','female','male','male']),
'year':np.array([2001,2001,2003,2002]),
'city':np.array(['北京','上海','广州','深圳'])
}
df04=DataFrame(data)
# step1 先增加一列,再删掉:
df04['new']=df04.sex=='female' # Note:df04.new 的语法 无法用来创建新的列,也无法用来删除指定的列
df04
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | new | |
---|---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 | True |
1 | 李四 | female | 2001 | 上海 | True |
2 | 王五 | male | 2003 | 广州 | False |
3 | 小明 | male | 2002 | 深圳 | False |
del df04['new']
df04.columns
Index(['name', 'sex', 'year', 'city'], dtype='object')
# 7,DataFrame数据的复制:
# 要显式地使用Series的copy方法:
series_copy=df04['sex'].copy()
series_copy
0 female
1 female
2 male
3 male
Name: sex, dtype: object
series_copy[2]='female' # 注意是 series_copy[2] 而不是 series_copy['2'],如果用后者,相当于创建一个新的元素。
series_copy
0 female
1 female
2 female
3 male
Name: sex, dtype: object
df04 # 对 series_copy 的修改不会影响原来的 dataframe
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
# 8,DataFrame 的转置
# 语法: 类似 Numpy, dataframe_obj.T
df04.T
{ vertical-align: top }
.dataframe thead th { text-align: right }
0 | 1 | 2 | 3 | |
---|---|---|---|---|
name | 张三 | 李四 | 王五 | 小明 |
sex | female | female | male | male |
year | 2001 | 2001 | 2003 | 2002 |
city | 北京 | 上海 | 广州 | 深圳 |
df04
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
# 9,给列索引和行索引的 name 属性赋值:
df04.index.name='Name'
df04.columns.name='Infor'
df04
{ vertical-align: top }
.dataframe thead th { text-align: right }
Infor | name | sex | year | city |
---|---|---|---|---|
Name | ||||
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
# 10,DataFrame的 index, column, values属性
df04.index # 一维数组
RangeIndex(start=0, stop=4, step=1, name='Name')
df04.columns # 一维数组
Index(['name', 'sex', 'year', 'city'], dtype='object', name='Infor')
df04.values # 二维数组
array([['张三', 'female', 2001, '北京'],
['李四', 'female', 2001, '上海'],
['王五', 'male', 2003, '广州'],
['小明', 'male', 2002, '深圳']], dtype=object)
# df04['new']=['12','abc',12,'NaN']
df04['new']=pd.Series(['Data Analysis dev','Data Analysis im','Data Analysis ba'],index=[0,1,2])
df04.values
array([['张三', 'female', 2001, '北京', 'Data Analysis dev'],
['李四', 'female', 2001, '上海', 'Data Analysis im'],
['王五', 'male', 2003, '广州', 'Data Analysis ba'],
['小明', 'male', 2002, '深圳', nan]], dtype=object)
二,索引对象
#以下按照《零基础 Python数据分析》来学习。
# DataFrame的索引也是对象,这些对象有自己的方法和属性
# pandas 中的索引对象是用于存储轴标签和其他元数据的 (例如轴名称或标签)。
# Series 或 DataFrame 时,你所使用任意数组或标签序列都可以在内部转换为索引对象。
data={
'name':np.array(['张三','李四','王五','小明']),
'sex':('female','female','male','male'),
'year':[2001,2001,2003,2002],
'city':('北京','上海','广州','深圳')
}
df=DataFrame(data)
# 1,索引对象
df.index
RangeIndex(start=0, stop=4, step=1)
df.columns
Index(['name', 'sex', 'year', 'city'], dtype='object')
# 2, 索引对象不可更改,强改会报错:
# index=df.index
col = df.columns
# index[1]=0
col[1]='a'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-144-daed13b54382> in <module>
3 col = df.columns
4 # index[1]=0
----> 5 col[1]='a'
~\anaconda3\envs\data_analysis\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
3908
3909 def __setitem__(self, key, value):
-> 3910 raise TypeError("Index does not support mutable operations")
3911
3912 def __getitem__(self, key):
TypeError: Index does not support mutable operations
# 3,索引对象类似于数组,其功能类似于一个固定大小的集合
df.index.name='infor item'
df.columns.name='details'
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
details | name | sex | year | city |
---|---|---|---|---|
infor item | ||||
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
'sex' in df.columns
True
2 in df.index
True
三,索引操作
# (1)讲解 Series 和 DataFrame 的索引操作的方法
# (2)与 Excel 数据类比,讲解 DataFrame 数据的选取与操作
# 1,重新索引:
# 1-1)Series 重新索引: s_obj.reindex(新索引列表[,method='ffill']) 返回一个新的 Series对象,不改变原来的 Series.
# 其中 method 参数可以缺省,缺省时,新索引列表中新引入的索引对应的元素值为 NaN,
# method='ffill'或'pad' 指元素值与前后一行相同(向前填充),method='bfill' 或'pad' 指元素值与前一行相同(向后填充)。
s_obj=Series([1,2,3,4],index=['a','c','d','f'])
s_obj
a 1
c 2
d 3
f 4
dtype: int64
s_obj2=s_obj.reindex(['a','c','m','d','e']) # 没有使用原来的索引 c,新引入了索引 e
s_obj2
a 1.0
c 2.0
m NaN
d 3.0
e NaN
dtype: float64
# reindex重新索引后,引入原 Series没有的索引时,可用 method='ffill',method='bfill' 进行填充。
# 填充规则:新引入的索引与原索引进行字符排序,按字符顺序的先后 进行向前或向后填充。
s_obj3=s_obj.reindex(['a','b','m','d','e'],method='ffill') # 向后填充, 用a对应的值向后填充b,用 f对应的值向后填充 m
s_obj3
a 1
b 1
m 4
d 3
e 3
dtype: int64
s_obj4=s_obj.reindex(['a','b','m','d','e'],method='bfill') # 向前填充。 用 c对应的值向前填充 b, m之后的值(NaN)向前填充m
s_obj4
f 4.0
b 2.0
m NaN
d 3.0
e 4.0
dtype: float64
s_obj # 不改变原来的 Series对象
a 1
b 2
c 3
d 4
dtype: int64
# 1-2)DataFrame 的重新索引:
# 对于 DataFrame 数据来说,行和列索引都可以被重新索引:
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
df=DataFrame(np.arange(9).reshape((3,3)),index=['a','c','d'],columns=['name','id','sex'])
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | id | sex | |
---|---|---|---|
a | 0 | 1 | 2 |
c | 3 | 4 | 5 |
d | 6 | 7 | 8 |
# 重新索引行:
df2=df.reindex(['a','b','c','d'])
# df2=df.reindex(index=['a','n','c','d']) # 重新指定行索引时 index关键字 可以省略
df2
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | id | sex | |
---|---|---|---|
a | 0.0 | 1.0 | 2.0 |
b | NaN | NaN | NaN |
c | 3.0 | 4.0 | 5.0 |
d | 6.0 | 7.0 | 8.0 |
# 重新索引列:
gender=df2.sex
df3=df.reindex(columns=['name','id','gender','job'],fill_value=[0,1,2]) # 重新指定列索引要使用 columns关键字
df3['gender']=gender
df3
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | id | gender | job | |
---|---|---|---|---|
a | 0 | 1 | 2.0 | [0, 1, 2] |
c | 3 | 4 | 5.0 | [0, 1, 2] |
d | 6 | 7 | 8.0 | [0, 1, 2] |
# 总结 reindex 函数的参数使用说明:
index 用于索引的新序列
method 填充缺失值方法 method='bfill' method='ffill'
fill_value 缺失值替代值 fill_value 将接收到的值assign给每一个缺失的元素,并不解包。
limit 最大填充量 (遇到再看)
# 2,更换索引:(针对 DataFrame) 返回新的 DataFrame, 不改变原来的 DataFrame
# set_index('某个列索引') # 使用某一列作为行索引,通常用来替代默认的行索引
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
data={
'name':np.array(['张三','李四','王五','小明']),
'sex':('female','female','male','male'),
'year':[2001,2001,2003,2002],
'city':pd.Series(['北京','上海','广州','深圳'])
}
df=DataFrame(data)
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
df2=df.set_index('name') # 使用 name 这列来替代默认行索引,'name'变成了行索引的index.name 属性值。
print(df2.index.name,df2.columns.name)
df2
# df3=df2.set_index('sex') 此时会将 将sex这列作为新返回的 d3的行索引,name列不存在于df3中。
name None
{ vertical-align: top }
.dataframe thead th { text-align: right }
sex | year | city | |
---|---|---|---|
name | |||
张三 | female | 2001 | 北京 |
李四 | female | 2001 | 上海 |
王五 | male | 2003 | 广州 |
小明 | male | 2002 | 深圳 |
df3=df2.reset_index()
print(df3.index.name,df3.columns.name)
df3
None None
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2001 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
# 对 DataFrame行索引的排序,行索引会随之排序,但excel表格里不会.
data={
'name':np.array(['张三','李四','王五','小明']),
'sex':('female','female','male','male'),
'year':[2001,2000,2003,2002],
'city':pd.Series(['北京','上海','广州','深圳'])
}
df=DataFrame(data)
df2=df.sort_values(by='year') # 不改变原 DataFrame,返回新的 DataFrame
df2
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
1 | 李四 | female | 2000 | 上海 |
0 | 张三 | female | 2001 | 北京 |
3 | 小明 | male | 2002 | 深圳 |
2 | 王五 | male | 2003 | 广州 |
# 此时,如果我们想得到像excel那样,数据排序之后,行号不跟随排序,依然是0,1,2...,可以:
df3=df2.reset_index() #将默认行索引变为 列, 重新生成一个新的默认行号:
df3
{ vertical-align: top }
.dataframe thead th { text-align: right }
index | name | sex | year | city | |
---|---|---|---|---|---|
0 | 1 | 李四 | female | 2000 | 上海 |
1 | 0 | 张三 | female | 2001 | 北京 |
2 | 3 | 小明 | male | 2002 | 深圳 |
3 | 2 | 王五 | male | 2003 | 广州 |
df4=df2.reset_index(drop=True) # 这样既可以生成一个新的默认行索引,又会删除多余的行索引。
df4
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 李四 | female | 2000 | 上海 |
1 | 张三 | female | 2001 | 北京 |
2 | 小明 | male | 2002 | 深圳 |
3 | 王五 | male | 2003 | 广州 |
# 3,索引和选取
# 通过索引来选取数据是 Series和 DataFrame 选取数据的手段(excel可以鼠标选取,VBA可以code指定)
# 3-1)Series 的数据选取:
# 3-1-1) Series_obj[n] # n是 0 到 Series_obj.size-1 范围的数。
# 3-1-2) Series_obj(行索引标签)
# 对选取元素的值的更改,会影响到原来的 Series或 DataFrame。
from pandas import Series,DataFrame
Series_obj=Series([1,2,1,5],index=['i1','i2','i3','i4'])
print(Series_obj[2])
print(Series_obj['i3']) # 单元素索引返回单个值
Series_obj[['i1','i4']] # 多元素索引 返回序列
Series_obj[:'i1'] # 切片索引 注意,与 Python列表不同之处: 列表是含左不含右, Series是都包含。 返回序列
Series_obj[:'i3'] # 切片索引 注意,与 Python列表不同之处: 列表是含左不含右, Series是都包含。 返回序列
Series_obj[Series_obj==2] # 布尔索引 无论符合条件的结果是单个元素还是多个元素,返回的都是序列
Series_obj[Series_obj<2] # 布尔索引 无论符合条件的结果是单个元素还是多个元素,返回的都是序列
Series_obj[2]=6 # 对选取元素的值的更改,会影响到原来的 Series或 DataFrame
Series_obj
1
1
i1 1
i2 2
i3 6
i4 5
dtype: int64
# 3-2)DataFrame 的数据选取:
# 选取行,选取列,选取行列子集
data={
'name':np.array(['张三','李四','王五','小明']),
'sex':('female','female','male','male'),
'year':[2001,2000,2003,2002],
'city':pd.Series(['北京','上海','广州','深圳'])
}
df=DataFrame(data)
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2000 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
df2=df.set_index('name')
df2
{ vertical-align: top }
.dataframe thead th { text-align: right }
sex | year | city | |
---|---|---|---|
name | |||
张三 | female | 2001 | 北京 |
李四 | female | 2000 | 上海 |
王五 | male | 2003 | 广州 |
小明 | male | 2002 | 深圳 |
# df2['王五'] # 报错
# df2[1] # 报错
# df.loc[df.index[0,2], ['name','city']] #报错
# df.loc[df.index[[0,2]], df.columns['name','city']] #报错
# df.loc[df.index[0:2], ['name','city']] #可以
# df.loc[df.index[[0,2]], ['name','city']] #可以
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-155-c741d5a2df48> in <module>
5 # df.loc[df.index[0:2], ['name','city']] #可以
6 # df.loc[df.index[[0,2]], ['name','city']] #可以
----> 7 df.loc[df.index[[0,2]], df.columns['name','city']] #可以
~\anaconda3\envs\data_analysis\lib\site-packages\pandas\core\indexes\base.py in __getitem__(self, key)
3939
3940 key = com.values_from_object(key)
-> 3941 result = getitem(key)
3942 if not is_scalar(result):
3943 if np.ndim(result) > 1:
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
# DataFrame 行列 选取总结:
# df2['王五'] # 报错
# df2[1] # 报错
# 多行:
# df2.[['张三','王五']] # 报错
# df2.[[1,3]] # 报错
# 为了防止弄混,DataFrame选取多行时,一律使用 loc和 iloc:(当使用切片时,不使用 loc iloc也是允许的)
# 单行:
df.loc['王五']
df.iloc[1]
# 多行:
df.iloc[0:2]
df.loc['李四':'王五']
df.loc[['张三','王五']]
df.iloc[[1,3]]
# 单列:
df.year # 按属性选取
df['year'] # 按列索引标签选取
# 多列:(不可使用切片)
df[['year','name']]
# 选取行列子集:
df.loc[df.index[0:2], ['name','city']]
df.loc[df.index[[0,2]], ['name','city']]
df.iloc[df.index[[0,2]], [0,2]]
# 布尔选择
# 与数组布尔型索引相似:!= ~ & |
df['sex']=='female' # 对某一列进行条件判断,返回布尔型 Series
df[df['sex']=='female'] # 返回符合条件的行列子集
df[df['sex']=='female' & df['year']==2001] # 必须使用括号
df[(df['sex']=='female') & ~(df['year']==2001)]
df[(df['sex']=='female') & (df['year']!=2001)]
df[(df['sex']=='female') | (df['year']==2002)]
# 对索引出来的数据进行修改,会影响到原来的数据结构
df[df['sex']=='female'] ='haha'
df['year'] = 2010
# 要想索引出来的数据独立使用,不影响原来数据结构,就要使用 .copy()
df2=df[df['sex']=='female'].copy()
df2.year=2030
df2=df[df['sex']=='female'].copy()
df2.year=2030
df2
# df
# df['year'] = 2010
# df
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2030 | 北京 |
1 | 李四 | female | 2030 | 上海 |
# 4,DataFrame的增,删,改,查(即索引)-----操作行和列
# 不会改变原来的 DataFrame,返回一个新的 DataFrame
# 4-1)查 上面的3-2)已经涵盖
# 4-2)增
# 4-2-1)对行的增加: df.append(new_data,ignore_index=True) 增加一行数据
import numpy as np
from pandas import DataFrame,Series
import pandas as pd
data={
'name':np.array(['张三','李四','王五','小明']),
'sex':('female','female','male','male'),
'year':[2001,2000,2003,2002],
'city':pd.Series(['北京','上海','广州','深圳'])
}
df=DataFrame(data)
new_data={
'name':"Tom",
'sex':'male',
'year':2007,
'city':'南京'
}
df2=df.append(new_data,ignore_index=True) # 返回一个新的 DataFrame, 不影响原来的。
df2
# df
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2000 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
4 | Tom | male | 2007 | 南京 |
# 4-2-2)对列的增加删除和修改在 《一,创建 DataFrame 4-3)通过列索引修改/赋值/创建 此列元素》 一节
# 4-3)删
# 4-3-1) 删除行:new_df=df.drop(2) 针对行索引是数字的有效。 不指定axis时,默认axis=0
new_df=df2.drop(4)
new_df
{ vertical-align: top }
.dataframe thead th { text-align: right }
name | sex | year | city | |
---|---|---|---|---|
0 | 张三 | female | 2001 | 北京 |
1 | 李四 | female | 2000 | 上海 |
2 | 王五 | male | 2003 | 广州 |
3 | 小明 | male | 2002 | 深圳 |
new_df2=new_df.set_index('name')
new_df2
{ vertical-align: top }
.dataframe thead th { text-align: right }
sex | year | city | |
---|---|---|---|
name | |||
张三 | female | 2001 | 北京 |
李四 | female | 2000 | 上海 |
王五 | male | 2003 | 广州 |
小明 | male | 2002 | 深圳 |
# new_df3=new_df2.drop(1) # 报错, 当行索引变为name时,数字参数不好用。
new_df3=new_df2.drop('李四',axis=0) # 不指定 axis时,默认axis=0 new_df2.drop('李四')
new_df3
{ vertical-align: top }
.dataframe thead th { text-align: right }
sex | year | city | |
---|---|---|---|
name | |||
张三 | female | 2001 | 北京 |
王五 | male | 2003 | 广州 |
小明 | male | 2002 | 深圳 |
# 4-3-2) 删除列:new_df=df.drop('city',axis=1)
# 或
# del df['city'](会影响原数据)
new_df4=new_df3.drop('city',axis=1)
new_df4
# new_df3
{ vertical-align: top }
.dataframe thead th { text-align: right }
sex | year | city | |
---|---|---|---|
name | |||
张三 | female | 2001 | 北京 |
王五 | male | 2003 | 广州 |
小明 | male | 2002 | 深圳 |
del new_df3['city'] # 会影响原数据
new_df3
{ vertical-align: top }
.dataframe thead th { text-align: right }
sex | year | |
---|---|---|
name | ||
张三 | female | 2001 |
王五 | male | 2003 |
小明 | male | 2002 |
# 4-4)改 当参数inplace=True时,会原地修改,当inplace=False或缺省时,不会影响原数据,返回一个新的数据。
# 这里的修改是指 对行列索引标签的修改,通过 df.rename()函数,可完成由于某些原因导致的标签录入错误的问题:
# new_df4=new_df3.rename(index={'王五':'王老五','小明':'马六'},columns={'sex':'gender'})
# new_df4
new_df3.rename(index={'王五':'王老五','小明':'马六'},columns={'sex':'gender'},inplace=True) # 可在原数据上进行修改
new_df3
{ vertical-align: top }
.dataframe thead th { text-align: right }
gender | year | |
---|---|---|
name | ||
张三 | female | 2001 |
王老五 | male | 2003 |
马六 | male | 2002 |
四,数据运算(重点内容)
# 1,pandas 算术运算
# 参与运算的 各个 Series 的size大小任意。
# 参与运算的 各个 DataFrame 的行数必须相同。
# 1-1)Series 算术运算
# 有共同索引的元素才会进行算术运算,如果没有,则引入 NaN --对齐操作
S1=Series([2.1,5,-3,0.2,0.3],index=['a','c','d','f','g'])
S2=Series([3.5,1.5,-2,0.5],index=['a','b','d','e']) # 共同索引为 'a','d'
S1+S2
a 5.6
b NaN
c NaN
d -5.0
e NaN
f NaN
g NaN
dtype: float64
# 1-2)DataFrame 算术运算
# 对于 DataFrame数据,对齐操作会同时发生在行和列上
df1=DataFrame(np.arange(9).reshape(3,3),index=['apple','banana','tea'],columns=['a','b','c'])
df2=DataFrame(np.arange(9).reshape(3,3),index=['apple','banana','coco'],columns=['a','b','d'])
df1+df2 # 运算返回的结果包含了参与运算的 df的所有的列,
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | b | c | d | |
---|---|---|---|---|
apple | 0.0 | 2.0 | NaN | NaN |
banana | 6.0 | 8.0 | NaN | NaN |
coco | NaN | NaN | NaN | NaN |
tea | NaN | NaN | NaN | NaN |
# 1-3)DataFrame 和 Series的 算术运算:
# 要求 Series的【行索引】和 DataFrame的【列索引】要一致。
#
S1=Series([2,3,4],index=['a','b','c'])
df1=DataFrame(np.arange(9).reshape(3,3),index=['apple','banana','tea'],columns=['a','b','c'])
df1+S1 # df的 a列+2 b列+3,c列+4
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | b | c | |
---|---|---|---|
apple | 2 | 4 | 6 |
banana | 5 | 7 | 9 |
tea | 8 | 10 | 12 |
df1=DataFrame(np.arange(9).reshape(3,3),index=['apple','banana','tea'],columns=['a','b','c'])
s1=df1.loc['apple'] # 取 DtaFrame的单行,这样取得的 Series的索引为 DataFrame的列索引
s1
a 0
b 1
c 2
Name: apple, dtype: int32
df1+s1
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | b | c | |
---|---|---|---|
apple | 0 | 2 | 4 |
banana | 3 | 5 | 7 |
tea | 6 | 8 | 10 |
# 2, 函数应用与映射
# 自定义函数对数据进行较为复杂的函数运算,然后应用到 pandas数据中
# 有三种使用自定义函数的datafrom方法: 参数 f 为自定义函数,也可以是lambda表达式
# 6-1)se.map(f) 函数 将函数套用在每个 Series 元素上
# 6-2)df.aplly(f,axis=1)函数 将函数套用在 DataFrame的行与列上,若 axis缺省,则默认axis=0
# 6-3)df.applymap(f)函数 将函数套用在 DataFrame的每个元素上
# 2-1)df.map(f) 函数 用在 Series元素上
# 使用 map函数,去掉‘元’字
data={
'fruit':['apple','orange','grape','banana'],
'price':['25元','42元','35元','15元']
}
df1=DataFrame(data)
df1
{ vertical-align: top }
.dataframe thead th { text-align: right }
fruit | price | |
---|---|---|
0 | apple | 25元 |
1 | orange | 42元 |
2 | grape | 35元 |
3 | banana | 15元 |
def removeyuan(x):
return x.split('元')[0] # 取‘25元’中的‘25’
# df1['price']=df1['price'].map(removeyuan) # df1['price'] 是序列
# 可以使用 lambda表达式代替 f:
df1['price']=df1['price'].map(lambda x:x.split('元')[0]) # 放在map()里 x在这里代表 元素
df1
{ vertical-align: top }
.dataframe thead th { text-align: right }
fruit | price | |
---|---|---|
0 | apple | 25 |
1 | orange | 42 |
2 | grape | 35 |
3 | banana | 15 |
# 2-2)df.apply(f) 函数
df2=DataFrame(np.random.randn(3,3),columns=['a','b','c'],index=['linux','win','mac'])
df2
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | b | c | |
---|---|---|---|
linux | 2.289954 | -0.86051 | -0.419287 |
win | 0.079616 | -2.25940 | -1.128554 |
mac | -0.828268 | -0.35262 | 1.106663 |
f=lambda x:x.max()-x.min() # 放在apply()里 x在这里代表 行或列
df2.apply(f)
a 3.118222
b 1.906779
c 2.235217
dtype: float64
df2.apply(f,axis=1)
linux 3.150464
win 2.339016
mac 1.934931
dtype: float64
# 2-3)df.applymap(f) 函数
df2.applymap(lambda x:'%.2f'%x) # 保留小数点两位
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | b | c | |
---|---|---|---|
linux | 2.29 | -0.86 | -0.42 |
win | 0.08 | -2.26 | -1.13 |
mac | -0.83 | -0.35 | 1.11 |
# 3, 排序
# 排序不会影响原来的 数据,返回新的数据。
# 3-1)Series se.sort_index(ascending=False)
# 对索引进行排序 ascending缺省时默认升序,ascending=False为降序
s1=Series([1,-1,3,2],index=['b','a','d','c'])
s1
b 1
a -1
d 3
c 2
dtype: int64
s1.sort_index() # 升序
s1.sort_index(ascending=False) # 降序
# s1 # 不会影响原来数据
d 3
c 2
b 1
a -1
dtype: int64
# 3-2) Series se.sort_values(ascending=False)
# 对value进行排序 ascending缺省时默认升序,ascending=False为降序
s1=Series([2,-1,3,5],index=['b','a','d','c'])
s1.sort_values()
s1.sort_values(ascending=False)
c 5
d 3
b 2
a -1
dtype: int64
# 3-3) DataFrame df.sort_index(asix=1,ascending=False) 对指定轴的 索引 进行排序
# 当axis缺省时,默认为 axis=0, 当 ascending缺省时,默认ascending=True
df1=DataFrame(np.random.randn(3,3),columns=['a','d','c'],index=['linux','win','mac'])
df1
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | d | c | |
---|---|---|---|
linux | 0.282841 | -1.783628 | -0.685621 |
win | -0.548632 | 0.754350 | 0.047237 |
mac | -0.521260 | -0.089012 | -0.711214 |
df1.sort_index(axis=0,ascending=True)
# df1.sort_index(axis=1)
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | d | c | |
---|---|---|---|
linux | 0.282841 | -1.783628 | -0.685621 |
mac | -0.521260 | -0.089012 | -0.711214 |
win | -0.548632 | 0.754350 | 0.047237 |
# 3-4) DataFrame df.sort_values(by='d',ascending=False) 对指定列的值进行排序
# 当 ascending缺省时,默认ascending=True
df1.sort_values(by='d',ascending=False)
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | d | c | |
---|---|---|---|
win | -0.548632 | 0.754350 | 0.047237 |
mac | -0.521260 | -0.089012 | -0.711214 |
linux | 0.282841 | -1.783628 | -0.685621 |
# 4, 汇总与统计
# df.sum(axis=0)
# axis=0 或 axis缺省 表示对每一列分别求和,axis=1表示对行求和,返回 Series数据。
# df.describe() 对每个数值型【列】进行统计,用于对数据的初步观察时使用,得到一个关于最值,平均值,标准差等信息的 DataFrame.
df=DataFrame(np.random.randn(3,3),columns=['a','d','c'])
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | d | c | |
---|---|---|---|
0 | 0.871841 | 1.235904 | 0.173434 |
1 | -2.764356 | -0.641077 | -0.107045 |
2 | 0.182462 | 0.602054 | -1.230373 |
df.sum(axis=1)
df.sum()
a -1.710053
d 1.196880
c -1.163983
dtype: float64
df.describe()
{ vertical-align: top }
.dataframe thead th { text-align: right }
a | d | c | |
---|---|---|---|
count | 3.000000 | 3.000000 | 3.000000 |
mean | -0.570018 | 0.398960 | -0.387994 |
std | 1.931360 | 0.954830 | 0.742878 |
min | -2.764356 | -0.641077 | -1.230373 |
25% | -1.290947 | -0.019512 | -0.668709 |
50% | 0.182462 | 0.602054 | -0.107045 |
75% | 0.527151 | 0.918979 | 0.033195 |
max | 0.871841 | 1.235904 | 0.173434 |
# 5, 唯一值与值计数 重点内容
# 都是针对 Series 对象而言的 (DataFrame的行和列也是 Series)
# series.unique() 获取不重复元素组成的 ndarray数组
s1=Series([2,-1,3,2,1,4,5,3,5])
s1.unique()
array([ 2, -1, 3, 1, 4, 5], dtype=int64)
# series.value_counts() 可以统计每个值出现的次数 返回以序列元素为索引,以次数为元素的 Series.#
s1.value_counts()
5 2
3 2
2 2
4 1
1 1
-1 1
dtype: int64
# 对于 DataFrame的行和列
data={
'fruit':['apple','orange','apple','banana'],
'price':[25,42,25,15],
'name':['myapple','orange','apple','bolo']
}
df1=DataFrame(data)
df1
{ vertical-align: top }
.dataframe thead th { text-align: right }
fruit | price | name | |
---|---|---|---|
0 | apple | 25 | myapple |
1 | orange | 42 | orange |
2 | apple | 25 | apple |
3 | banana | 15 | bolo |
df1['fruit'].unique()
array(['apple', 'orange', 'banana'], dtype=object)
df1['fruit'].value_counts()
apple 2
orange 1
banana 1
Name: fruit, dtype: int64
df1.iloc[2].unique()
array(['apple', 25], dtype=object)
df1.iloc[2].value_counts()
apple 2
25 1
Name: 2, dtype: int64
五,层次化索引
# 层次化索引就是轴上有多个级别索引,即索引是个多维列表,这里只讨论二维列表。
# 1,Series 数据的层次化索引创建:
series_obj=Series(np.random.randn(9),index=[['one','one','one','two','two','two','three','three','three'],['a','b','c']*3])
series_obj
one a -0.913606
b 1.258280
c 0.430108
two a 0.366005
b -1.821770
c 1.135238
three a 0.131614
b -0.407047
c 0.576246
dtype: float64
series_obj['two'] # 对层次化序列的外层索引
a 0.366005
b -1.821770
c 1.135238
dtype: float64
series_obj[:,'a'] # 对层次化序列的内层索引 所有行的 a 行
one -0.913606
two 0.366005
three 0.131614
dtype: float64
series_obj['two','a'] # 对层次化序列的内层索引 two行的 a 行
0.36600524764982423
series_obj.index # 该索引对象为 MulitiIndex
MultiIndex([( 'one', 'a'),
( 'one', 'b'),
( 'one', 'c'),
( 'two', 'a'),
( 'two', 'b'),
( 'two', 'c'),
('three', 'a'),
('three', 'b'),
('three', 'c')],
)
# 2,DataFrame 数据的层次化索引创建:
# 对于 DataFrame,行和列都可以为层次化索引:
df1=DataFrame(np.arange(16).reshape(4,4),index=[['one','one','two','two'],['a','b','a','b']])
df1
{ vertical-align: top }
.dataframe thead th { text-align: right }
0 | 1 | 2 | 3 | ||
---|---|---|---|---|---|
one | a | 0 | 1 | 2 | 3 |
b | 4 | 5 | 6 | 7 | |
two | a | 8 | 9 | 10 | 11 |
b | 12 | 13 | 14 | 15 |
df2=DataFrame(np.arange(16).reshape(4,4),columns=[['one','one','two','two'],['a','b','a','b']])
df2
{ vertical-align: top }
.dataframe thead tr th { text-align: left }
one | two | |||
---|---|---|---|---|
a | b | a | b | |
0 | 0 | 1 | 2 | 3 |
1 | 4 | 5 | 6 | 7 |
2 | 8 | 9 | 10 | 11 |
3 | 12 | 13 | 14 | 15 |
df3=DataFrame(np.arange(16).reshape(4,4),index=[['one','one','two','two'],['a','b','a','b']],
columns=[['apple','apple','orange','orange'],['size','price','size','price']])
df3
{ vertical-align: top }
.dataframe thead tr th { text-align: left }
apple | orange | ||||
---|---|---|---|---|---|
size | price | size | price | ||
one | a | 0 | 1 | 2 | 3 |
b | 4 | 5 | 6 | 7 | |
two | a | 8 | 9 | 10 | 11 |
b | 12 | 13 | 14 | 15 |
df3['apple']
{ vertical-align: top }
.dataframe thead th { text-align: right }
size | price | ||
---|---|---|---|
one | a | 0 | 1 |
b | 4 | 5 | |
two | a | 8 | 9 |
b | 12 | 13 |
df3['apple','size'] # 返回从层次化索引序列
one a 0
b 4
two a 8
b 12
Name: (apple, size), dtype: int32
df3.loc['one']
{ vertical-align: top }
.dataframe thead tr th { text-align: left }
apple | orange | |||
---|---|---|---|---|
size | price | size | price | |
a | 0 | 1 | 2 | 3 |
b | 4 | 5 | 6 | 7 |
df3.loc['one','a'] # 返回层次化索引序列
apple size 0
price 1
orange size 2
price 3
Name: (one, a), dtype: int32
# 3,重排分级顺序
# 用到再细研究
# 通过 swaplevel 方法可以对层次化索引进行重排:
df3
{ vertical-align: top }
.dataframe thead tr th { text-align: left }
apple | orange | ||||
---|---|---|---|---|---|
size | price | size | price | ||
one | a | 0 | 1 | 2 | 3 |
b | 4 | 5 | 6 | 7 | |
two | a | 8 | 9 | 10 | 11 |
b | 12 | 13 | 14 | 15 |
df3.swaplevel(0,1)
{ vertical-align: top }
.dataframe thead tr th { text-align: left }
apple | orange | ||||
---|---|---|---|---|---|
size | price | size | price | ||
a | one | 0 | 1 | 2 | 3 |
b | one | 4 | 5 | 6 | 7 |
a | two | 8 | 9 | 10 | 11 |
b | two | 12 | 13 | 14 | 15 |
# 4,对层次化索引的 pandas 数据进行汇总统计
# 对层次化索引的 pandas 数据进行汇总统计时,可以通过 level 参数指定在某层次上进行汇总统计。
# sum()的参数 level=0 表示按相同外层索引的所有子行或子列相加,level=1 表示按相同内层索引的行或列进行求和。
# 层次化索引的用途在后面会详细讲解。
df3.sum(level=0,axis=0) # 表示按相同外层索引的所有子行或子列相加 one 的 a+b two 的 a+b
{ vertical-align: top }
.dataframe thead tr th { text-align: left }
apple | orange | |||
---|---|---|---|---|
size | price | size | price | |
one | 4 | 6 | 8 | 10 |
two | 20 | 22 | 24 | 26 |
df3.sum(level=1,axis=0) # 表示按相同内层索引的行或列进行求和 one和two的 a+a , b+b
{ vertical-align: top }
.dataframe thead tr th { text-align: left }
apple | orange | |||
---|---|---|---|---|
size | price | size | price | |
a | 8 | 10 | 12 | 14 |
b | 16 | 18 | 20 | 22 |
df3.sum(level=0,axis=1) # 表示按相同外层索引的所有子行或子列相加
{ vertical-align: top }
.dataframe thead th { text-align: right }
apple | orange | ||
---|---|---|---|
one | a | 1 | 5 |
b | 9 | 13 | |
two | a | 17 | 21 |
b | 25 | 29 |
df3.sum(level=1,axis=1) # 表示按相同内层索引的行或列进行求和
{ vertical-align: top }
.dataframe thead th { text-align: right }
size | price | ||
---|---|---|---|
one | a | 2 | 4 |
b | 10 | 12 | |
two | a | 18 | 20 |
b | 26 | 28 |
六,可视化(暂时忽略)
下一篇将讲述 pandas对外部数据的读取,处理和存储。
Pandas_基础_全的更多相关文章
- python基础_格式化输出(%用法和format用法)(转载)
python基础_格式化输出(%用法和format用法) 目录 %用法 format用法 %用法 1.整数的输出 %o -- oct 八进制%d -- dec 十进制%x -- hex 十六进制 &g ...
- 算法基础_递归_求杨辉三角第m行第n个数字
问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...
- MySQL基础----py全栈
目录 MySQL基础----py全栈 一.引言 1.什么是数据? 2.什么是数据库(DB)? 3.什么是数据库管理系统(DBMS)? 4.什么是数据库系统? 5.数据库管理系统由来 6.什么是数据模型 ...
- Java基础16:Java多线程基础最全总结
Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...
- Flutter实战视频-移动电商-05.Dio基础_引入和简单的Get请求
05.Dio基础_引入和简单的Get请求 博客地址: https://jspang.com/post/FlutterShop.html#toc-4c7 第三方的http请求库叫做Dio https:/ ...
- Flutter实战视频-移动电商-08.Dio基础_伪造请求头获取数据
08.Dio基础_伪造请求头获取数据 上节课代码清楚 重新编写HomePage这个动态组件 开始写请求的方法 请求数据 .但是由于我们没加请求的头 所以没有返回数据 451就是表示请求错错误 创建请求 ...
- Flutter实战视频-移动电商-60.购物车_全选按钮的交互效果制作
60.购物车_全选按钮的交互效果制作 主要做全选和复选框的这两个功能 provide/cart.dart 业务逻辑写到provide里面 先持久化取出来字符串,把字符串编程list.循环list ca ...
- [Zlib]_[0基础]_[使用zlib库压缩文件]
场景: 1. WIndows上没找到系统提供的win32 api来生成zip压缩文件, 有知道的大牛麻烦留个言. 2. zlib比較经常使用,编译也方便,使用它来做压缩吧. MacOSX平台默认支持z ...
- DL基础补全计划(一)---线性回归及示例(Pytorch,平方损失)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
随机推荐
- 用C写一个简单的推箱子游戏(二)
下面接着上一篇随笔<用C写一个简单的推箱子游戏(一)>来写 tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么 ...
- 【4】进大厂必须掌握的面试题-Java面试-jdbc
1.什么是JDBC驱动程序? JDBC驱动程序是使Java应用程序与数据库进行交互的软件组件.JDBC驱动程序有4种类型: JDBC-ODBC桥驱动程序 本机API驱动程序(部分为Java驱动程序) ...
- ok6410 3.0.1内核调用V4L接口出错解决方法(转)
在做视频监控项目,以前一直用的是2.6.36的内核,一直很正常,但是这几天换3.0.1内核,启动程序,却出现了错误,如下: ./test_usb_camera XXXXXXXXXXXXXXXXXXXX ...
- java中的t怎么用
<T> T表示返回值是一个泛型,传递啥,就返回啥类型的数据,而单独的T就是表示限制你传递的参数类型,这个案例中,通过一个泛型的返回方式,获取每一个集合中的第一个数据, 通过返回值<T ...
- Lock、Synchronized锁区别解析
上篇博文在讲解 ConcurrentHashMap 时说到 1.7 中 put 方法实现同步的方式是使用继承了 ReentrantLock 类的 segment 内部类调用 lock 方法实现的,而在 ...
- k8s-命令创建service
查看命令帮助 [root@master kubernetes]# kubectl create service -h Create a service using specified subcomma ...
- PHP-FPM包的安装与配置 转
实验环境:CentOS7 [root@~ localhost]#yum -y install php-fpm php-fpm包:用于将php运行于fpm模式 #在安装php-fpm时,一般同时安装如下 ...
- Linux运维学习第三周记
日落狐狸眠冢上 夜归儿女笑灯前 人生有酒须当醉 一滴何曾到九泉 愿醉卧沙场可未有匹夫之勇. 第三周学记 第三周主要学习正则表达式和Shell编程 1.正则表达式基本字符 2.扩展正则表达式 3.gre ...
- CentOS 8 关闭防火墙
SELINUX=disabled vim /etc/selinux/config systemctl disable firewalld.service
- JDK源码阅读-------自学笔记(二十四)(java.util.LinkedList 再探 自定义讲解)
一.实现get方法 1.一般思维实现思路 1).将对象的值放入一个中间变量中. 2).遍历索引值,将中间量的下一个元素赋值给中间量. 3).返回中间量中的元素值. 4).示意图 get(2),传入角标 ...