Pandas全面介绍及使用
1 Pandas 的介绍和安装2 Pandas中Series的数据结构介绍2.1 Series的介绍2.2 Series的创建2.3 Series的索引与切片2.3.1 Series的索引与值2.3.2 Series的索引与切片
2.4 Series 的运算
3 Pandas中DataFrame的数据结构介绍3.1 DataFrame介绍3.2 DataFrame创建3.3 DataFrame基础操作3.4 DataFrame的增删改查3.4.1 DataFrame的查3.4.3 DataFrame的增3.4.4 DataFrame的删
3.5 DataFrame的合并3.5.1 pd.concat3.5.2 df.append3.5.3 pd.merge3.5.4 df.join
1 Pandas 的介绍和安装
(1)为什么会有Pandas? Pandas支持大部分Numpy语言风格,尤其是数组函数与广播机制的各种数据处理。但是Numpy更适合处理同质型的数据。而Pandas的设计就是用来处理表格型或异质型数据的,高效的清洗、处理数据。 (2)Pandas是什么? Pandas是基于Numpy的一种工具,提供了高性能矩阵的运算,该工具是为了解决数据分析任务而创建的。也是贯穿整个Python数据分析非常核心的工具。 (3)Pandas涉及内容 (4)Pandas安装 直接在dos命令行中输入pip install pandas。
2 Pandas中Series的数据结构介绍
2.1 Series的介绍
Series是一种一维的数组型对象,它包含了一个值序列(values),并且包含了数据标签,称为索引(index),本质相当于一列数据。
2.2 Series的创建
语法:pd.Series(data=None,index=None,dtype=None,name=None,copy=False)
data:创建数组的数据,可为array-like, dict, or scalar valueindex:指定索引dtype:数组数据类型name:数组名称copy:是否拷贝注意:data可为iterable, dict, or scalar value
"""data为iterable"""
s1
= pd
.Series
([1,2,3,4],index
=['a','b','c','d'],name
='example')
print(s1
)
"""注意1:pandas里面索引是可重复的"""
s2
= pd
.Series
([1,2,3,4,5],index
=list("aacde"))
print(s2
)
"""注意2:索引的个数与data的个数是否要一致?index与values的个数必须一致"""
"""data为字典,key对应索引,value对应值"""
dic1
= {"name":"steven","age":18,"gender":"male"}
s4
= pd
.Series
(dic1
)
print(s4
)
dic2
= {"name":"steven","age":18,"gender":"male"}
index_li
= ["class","name","gender"]
s5
= pd
.Series
(dic2
,index
=index_li
)
print(s5
)
"""data为向量scalar"""
s6
= pd
.Series
(np
.random
.randint
(1,10,size
=5),dtype
="float")
print(s6
)
除此之外,Pandas可以使用Numpy的数组函数
s.dtype :查看数据类型s.astype():修改数据类型s.head(n) :预览数据前5条s.tail(n) :预览数据后5条
但是如果需要显示所有数据,则需以下代码。但并不建议使用
`
pd
.set_option
('display.max_columns', None)
pd
.set_option
('display.max_rows', None)
pd
.set_option
('max_colwidth',100)
2.3 Series的索引与切片
2.3.1 Series的索引与值
s.index : 查看索引s.values:查看值序列s.reset_index(drop=False):重置索引drop :是否删除原索引 默认为否注意 :索引对象是不可变的,所以不能单个修改索引
s1
= pd
.Series
(np
.arange
(5))
s2
= pd
.Series
(['a','b','c'],index
=['A','B','C'])
print(s1
,s2
)
print(s1
.index
,type(s1
.index
),s2
.index
,type(s2
.index
))
print(s1
.values
,type(s1
.values
),s2
.values
,type(s2
.values
))
print(s1
.index
[1])
print(s2
.index
[1])
2.3.2 Series的索引与切片
s[‘标签’]: 通过标签s[‘索引’] :通过索引s.loc[标签] : 通过标签s.iloc[索引]:通过索引
s1
= pd
.Series
(np
.arange
(1,6),index
=list("abbde"))
print(s1
)
print(s1
["b"],'\n','----------------')
print(s1
[1],'\n','----------------')
print(s1
.loc
["b"],'\n','----------------')
print(s1
.iloc
[1],'\n','----------------')
print(s1
[["a","d"]],'\n','----------------')
print(s1
[[0,3]],'\n','----------------')
print(s1
[s1
>3],'\n','----------------')
data
= ["a","b",None]
print(pd
.Series
(data
),'\n','----------------')
data
= [1,2,None]
print(pd
.Series
(data
),'\n','----------------')
2.4 Series 的运算
共同索引对应为运算,其它填充NaN没有共同索引时,则全部为NaN
"""共同索引对应为运算,其它填充NaN"""
s1
= pd
.Series
(np
.arange
(10,20),index
=range(10))
s2
= pd
.Series
(np
.arange
(20,25),index
=range(5))
print(s1
,'\n','----------------')
print(s2
,'\n','----------------')
print(s1
+s2
,'\n','----------------')
"""没有共同索引时,则全部为NaN"""
s3
= pd
.Series
(np
.arange
(5),index
=range(5))
s4
= pd
.Series
(np
.arange
(5,10),index
=range(5,10))
print(s3
,'\n','----------------')
print(s4
,'\n','----------------')
print(s3
+s4
,'\n','----------------')
3 Pandas中DataFrame的数据结构介绍
3.1 DataFrame介绍
DataFrame表示的是矩阵的数据表,它包含已排序的列集合,每一列可以是不同的值类型(数值,字符串,布尔值)。在DataFrame中,数据被存储为一个以上的二维块。
3.2 DataFrame创建
pd.DataFrame(data=None,index=None,columns=None,dtype=None,copy=False)
data:创建数组的数据,可为ndarray, dictindex:指定索引dtype:数组数据类型copy:是否拷贝
d1
= pd
.DataFrame
(np
.random
.randint
(1,100,size
=(3,3)))
print(d1
,'\n','-------------------------------------------------')
"""
行索引 index 0轴 axis=0
列索引 columns 1轴 axis=1
值 values
"""
print(d1
.index
,'\n','-------------------------------------------------')
print(d1
.columns
,'\n','-------------------------------------------------')
print(d1
.values
,'\n','-------------------------------------------------')
d2
= pd
.DataFrame
(np
.random
.randint
(1,100,size
=(3,3)),index
=["amy","mia","steven"],columns
=["java","python","R"])
print(d2
,'\n','-------------------------------------------------')
"""
字典形式的data(同Seires)
- key值为列索引
- value为值
- 行索引 不指定就为默认的
"""
data
= {
"name":["amy","mia","steven"],
"lesson":["java","python","R"]
}
d3
= pd
.DataFrame
(data
)
print(d3
,'\n','-------------------------------------------------')
d4
= pd
.DataFrame
(data
,columns
=["lesson","name"])
print(d4
,'\n','-------------------------------------------------')
d5
= pd
.DataFrame
(data
,columns
=["lesson"])
print(d5
,'\n','-------------------------------------------------')
d6
= pd
.DataFrame
(data
,columns
=["lesson","name","age"])
print(d6
,'\n','-------------------------------------------------')
data1
= [
{"name":"amy","age":18,"gender":1},
{"name":"jun","age":20},
{"name":"hy","gender":1}
]
d7
= pd
.DataFrame
(data1
)
print(d7
,'\n','-------------------------------------------------')
"""
重置索引:
除了创建时可以指定,我们创建后还可以通过df.reindex()进行重置索引
语法:df.reindex(index=None, columns=None, axis=None,fill_value=nan)
"""
df
= pd
.DataFrame
(np
.arange
(9).reshape
(3,3),index
=list("abc"),columns
=list("ABC"))
print(df
,'\n','-------------------------------------------------')
df1
= df
.reindex
(index
=[1,2,3])
print(df1
,'\n','-------------------------------------------------')
df2
= df
.reindex
(index
=["b","c","a"])
print(df2
,'\n','-------------------------------------------------')
df3
= df
.reindex
(index
=["b","c","a","d"])
print(df3
,'\n','-------------------------------------------------')
df4
= df
.reindex
(columns
=list("BCA"))
print(df4
,'\n','-------------------------------------------------')
df5
= df
.reindex
(index
=list("bca"),columns
=list("CBA"))
print(df5
,'\n','-------------------------------------------------')
3.3 DataFrame基础操作
df.shape :查看数组形状,返回值为元组df.dtypes :查看列数据类型df.ndim :数据维度,返回为整数df.index :行索引df.columns :列索引df.values :值d.head(n) :显示头部几行,默认前5行d.tail(n) :显示末尾几行,默认后5行d.info() :相关信息概述
data
= [
{"name":"amy","age":18,"tel":10086},
{"name":"bob","age":18},
{"name":"james","tel":10086},
{"name":"zs","tel":10086},
{"name":"james","tel":10086},
{"name":"ls","tel":10086},
]
d1
= pd
.DataFrame
(data
)
print(d1
,'\n','-------------------------------------------------')
print(d1
.shape
,'\n','-------------------------------------------------')
print(d1
.ndim
,'\n','-------------------------------------------------')
print(d1
.dtypes
,'\n','-------------------------------------------------')
print(d1
.head
(),'\n','-------------------------------------------------')
print(d1
.tail
(),'\n','-------------------------------------------------')
print(d1
.info
(),'\n','-------------------------------------------------')
3.4 DataFrame的增删改查
3.4.1 DataFrame的查
直接使用索引与标签 使用loc及iloc查询数据 ·df.loc[] 通过轴标签选择数据 ·df.iloc[] 通过整数索引选择数据
"""使用索引查询数据"""
data
= [
{"name":"amy","age":18,"tel":10086},
{"name":"bob","age":18},
{"name":"james","tel":10086},
{"name":"zs","tel":10086},
{"name":"james","tel":10086},
{"name":"ls","tel":10086},
]
d1
= pd
.DataFrame
(data
,index
=list("abcdef"))
print(d1
,'\n','-------------------------------------------------')
"""
行索引
"""
print(d1
[:2],'\n','-------------------------------------------------')
print(d1
[:"b"],'\n','-------------------------------------------------')
"""
列索引
"""
print(d1
["name"],'\n','-------------------------------------------------')
print(d1
.name
,'\n','-------------------------------------------------')
print(type(d1
["name"]),'\n','-------------------------------------------------')
print(d1
[["name","tel"]],'\n','-------------------------------------------------')
print(type(d1
[["name","tel"]]),'\n','-------------------------------------------------')
print(d1
[:2]["name"],'\n','-------------------------------------------------')
print(d1
[d1
["name"]!="james"],'\n','-------------------------------------------------')
"""使用loc及iloc查询数据"""
idx
= ["PHP","JAVA","Python","GO"]
col
= ["one","two","three","four"]
d2
= pd
.DataFrame
(np
.arange
(16).reshape
(4,4),index
=idx
,columns
=col
)
print(d2
,'\n','-------------------------------------------------')
"""
df.loc[行,列]
取单
"""
print(d2
.loc
["Python",:],'\n','-------------------------------------------------')
print(d2
.loc
[:,"three"],'\n','-------------------------------------------------')
"""
df.loc[行,列]
取多行
"""
print(d2
.loc
[["PHP","GO"],:],'\n','-------------------------------------------------')
print(d2
.loc
["PHP":"GO",:],'\n','-------------------------------------------------')
print(d2
.loc
[:,["one","four"]],'\n','-------------------------------------------------')
print(d2
.loc
["JAVA":"GO",:],'\n','-------------------------------------------------')
"""
索引位置
df.iloc[行,列]
"""
print(d2
.iloc
[2,:],'\n','-------------------------------------------------')
print(d2
.iloc
[:,2],'\n','-------------------------------------------------')
print(d2
.iloc
[1::,:],'\n','-------------------------------------------------')
print(d2
.loc
[:,"one":"three"][d2
.two
>3],'\n','-------------------------------------------------')
idx
= ["PHP","GO","Python","GO"]
col
= ["one","two","three","four"]
d3
= pd
.DataFrame
(np
.arange
(16).reshape
(4,4),index
=idx
,columns
=list("1234"))
print(d3
,'\n','--------------------------------------------')
"""
注意:如果 出现了重复索引 然后切片时出现歧义则会报错
注意:如果列索引 为 1,2,3,4这种就不要使用 d3.1 访问会报错。
"""
修改数据主要遵循以下两点:
- 查询数据
- 再赋值
注意:Pandas中可以直接赋值np
.nan,且赋值当前列数据会自动转为浮点类型。而不是整个数组都转,这主要是因为Pandas数据可以是异质性。
idx
= ["PHP","GO","Python","GO"]
col
= ["one","two","three","four"]
d4
= pd
.DataFrame
(np
.arange
(16).reshape
(4,4),index
=idx
,columns
=col
)
print(d4
,'\n','--------------------------------------------')
d4
.loc
["PHP",:] = 8
print(d4
,'\n','--------------------------------------------')
d4
.loc
[:,"two"] = 10
print(d4
,'\n','--------------------------------------------')
d4
.loc
["Python","three"] = 80
print(d4
,'\n','--------------------------------------------')
d4
.loc
["Python","three"] = np
.nan
print(d4
,'\n','--------------------------------------------')
3.4.3 DataFrame的增
新增列:df[“新的列标签”] = 值 注意:添加列,则新添加的值的长度必须与其它列的长度保持一致,否则会报错。插入列:如果需要在数据中插入列,则使用 df.insert(loc, column, value) • loc 为插入列的位置 • column 为插入列的标签 • value 为插入列的值添加行:df.loc[“新的行标签”,:] = 值除此之外,我们还可以通过 df.append(df2) 方法添加行,但类似于数组与数组的堆叠拼接。所以df2的列索引必须同df一致。
"""新增列"""
idx
= ["PHP","JAVA","Python","GO"]
col
= ["one","two","three","four"]
d5
= pd
.DataFrame
(np
.arange
(16).reshape
(4,4),index
=idx
,columns
=col
)
print(d5
,'\n','--------------------------------------------')
d5
["five"] = 10
print(d5
,'\n','--------------------------------------------')
d5
["five"] = [1,2,3,4]
print(d5
,'\n','--------------------------------------------')
"""插入列"""
d5
.insert
(0,"six",[4,5,76,8])
print(d5
,'\n','--------------------------------------------')
"""添加行"""
d5
.loc
["C++",:] = np
.arange
(6)
print(d5
,'\n','--------------------------------------------')
"""叠加"""
d6
= pd
.DataFrame
(np
.arange
(6).reshape
(1,6),index
=["C"],columns
=d5
.columns
)
d5
= d5
.append
(d6
)
print(d5
,'\n','--------------------------------------------')
3.4.4 DataFrame的删
法1:del df[“列标签”]法2:df.drop(axis=0,index=None,columns=None, inplace=False)
d7
= pd
.DataFrame
(np
.arange
(9).reshape
(3,3),index
=list("abc"),columns
=list("ABC"))
print(d7
,'\n','--------------------------------------------')
del d7
["C"]
print(d7
,'\n','--------------------------------------------')
d8
= d7
.drop
(columns
="A")
print(d8
,'\n','--------------------------------------------')
d9
= d7
.drop
(index
=["a","c"])
print(d9
,'\n','--------------------------------------------')
d10
= d7
.drop
("b",axis
=0)
print(d10
,'\n','--------------------------------------------')
d11
= d7
.drop
("A",axis
=1)
print(d11
,'\n','--------------------------------------------')
3.5 DataFrame的合并
3.5.1 pd.concat
语法:df = pd.concat(objs, axis = 0, ignore_index = False, join = "outer (1)concat是”contatenate"的缩写,指的是多表之间的“拼接”。事实上“拼接”和“合并”还是有区别的,拼接一般是上下,合并时左右。 (2)参数解释:
objs: 指的是要合并的dataframe(们)。可以是一个列表[df1,df2,…]也可以是一个集合(df1,df2,…)。axis:指的是拼接的方向。axis = 0指的是拼接行(向下拼接),axis = 1指的是拼接列(向右拼接)。ignore_index: 指的是拼接后是否忽视原df各自的索引。比如,假如我们按行拼接,原来df1中有五条数据,索引是0,1,2,3,4。原来的df2中也有五条数据,索引也是0,1,2,3,4。如果我们在合并时,将ignoreindex的值设为False,那么拼接后df的索引就是0,1,2,3,4,0,1,2,3,4。那么如果将ignore_index的值设为True, 那么拼接后df的索引就是0,1,2,3,4,5,6,7…join:表示“如何拼接”。由于两表中的信息可能是不同的,所以要设置这个参数以表明拼接方式。其中,outer表示取并集,inner表示取交集。 举例来看一下吧
df1
= pd
.DataFrame
(np
.arange
(12).reshape
(4,3),index
=range(0,4),columns
=list('abc'))
df2
= pd
.DataFrame
(np
.arange
(12).reshape
(4,3),index
=range(0,4),columns
=list('def'))
print(df1
,'\n','--------------------------------------------')
print(df2
,'\n','--------------------------------------------')
df4
= pd
.concat
([df1
,df2
],axis
=1,ignore_index
=False)
df4
3.5.2 df.append
语法:df = df1.append(df2) append可以视作axis=0的,简便版的concat。也就是说,它只支持行拼接,同时比concat简便一些。
这里要注意和concat的用法区别。concat是pd的属性,所以调用的时候应该是pd.concat((df1,df2)),而append是对df的方法,所以调用的时候是df1.append(df2)
df1
= pd
.DataFrame
(np
.arange
(12).reshape
(4,3),index
=range(0,4),columns
=list('abc'))
df2
= pd
.DataFrame
(np
.arange
(12).reshape
(4,3),index
=range(0,4),columns
=list('def'))
print(df1
,'\n','--------------------------------------------')
print(df2
,'\n','--------------------------------------------')
df3
= df1
.append
(df2
)
df3
3.5.3 pd.merge
语法:df = pd.merge(left, right, how = "inner",on = "None") 与concat(拼接)不同,merge才是真正意义上的”合并“。
拼接和合并的区别在于,拼接只是简单地”堆“在一起,而合并则是基于某一个”主键“将两个表”合“在一起。事实上merge也有很多参数,这里只列了最常用的。其中:参数解释: (1)left: 左表。也就是第一个df。 (2)right:右表。也就是第二个df。 (3)how: 和concat里面的"join"类似,表示“如何合并两表。除了”inner“和”outer“以外,merge中还有”left"(基于左表进行合并)和“right”(基于右表进行合并)。具体地:1)left: 只使用左表的键。2)right:只使用右表的键。3)inner: 使用左右表键的交集。4)outer:使用左右表键的并集。 (4)on: 表示按照哪一个键来进行合并
df1
= pd
.DataFrame
(np
.arange
(12).reshape
(4,3),index
=range(0,4),columns
=list('abc'))
df2
= pd
.DataFrame
(np
.arange
(12).reshape
(4,3),index
=range(0,4),columns
=list('def'))
print(df1
,'\n','--------------------------------------------')
print(df2
,'\n','--------------------------------------------')
df3
= pd
.merge
(df1
,df2
,how
='outer',left_index
=True,right_index
=True)
df3
3.5.4 df.join
语法:df = left.join(right,on = "key", how = "left")
类似于append之于concat,join也可以被理解为merge的一个简便并且特殊的方法。join也可以设置参数"how",只不过这里默认值不同。Merge中,how的默认值是”inner“,join中的默认值为”left"。
df1
= pd
.DataFrame
(np
.arange
(12).reshape
(4,3),index
=range(0,4),columns
=list('abc'))
df2
= pd
.DataFrame
(np
.arange
(12).reshape
(4,3),index
=range(0,4),columns
=list('def'))
print(df1
,'\n','--------------------------------------------')
print(df2
,'\n','--------------------------------------------')
df3
= df1
.join
(df2
,how
='right')
df3