三、pandas
1、导入pandas
import pandas as pd
pd可改名
2、常用数据类型————Series
Series是带标签的一维数组
创建Series数组
pd.Series([a,b,c,d,e],index=list('1234'))
a~d可为数或字符串,但如果是字符串,要加**‘’**号
结果为:
1 a
2 b
3 c
4 d
dtype:
#dtype会接相应的数据类型
#如果不加index,左侧序号从0开始不断增加
结合字典使用
基本用法
dict1={'name':'Xiaoming','age':11,'gender':'male'}
PD=pd.Series(dict1)
print(PD)
结果为:
name Xiaoming
age 11
gender male
dtype: object
同时可以使用键值对功能
print(PD['name'])
结果为:
Xiaoming
或
print(PD[0])
结果为:
Xiaoming
若取连续数据
print(PD[:3])
结果为:
name Xiaoming
age 11
gender male
dtype: object
若取不连续数据
print(PD[[0,2]])
结果为:
name Xiaoming
gender male
Series的切片和索引
使用条件判断切片(布尔索引)
a=pd.Series(range(10))
print(a[a<5])
结果为:
0 0
1 1
2 2
3 3
4 4
dtype: int64
只取了0~4
使用位置切片
print(a[:5])
结果为:
0 0
1 1
2 2
3 3
4 4
dtype: int64
更多位置切片在上方结合字典使用那里有提及
提取横向索引(index)(如键)
这里使用字典的例子
dict1={'name':'Xiaoming','age':11,'gender':'male'}
PD=pd.Series(dict1)
print(PD.index)
结果为:
Index(['name', 'age', 'gender'], dtype='object')
简洁提取:
for i in PD.index:
print(i)
结果为:
name
age
gender
提取值
for i in PD.values:
print(i)
结果为:
Xiaoming
11
male
Series的where函数用法
a = pd.Series(range(5))
b = a.where(a>3,10)
print(b)
我们看一下结果:
0 10
1 10
2 10
3 10
4 4
dtype: int64
可以看到:当a>3时(符合条件),数值不变;当a<=3时(不符合条件),数值变成10。
可知,Series的where函数和numpy的where函数作用效果相反
3、常用数据类型————DataFrame
Dataframe是二维数组,Series容器
pandas也可以使用dtype来查看数据类型,使用astype来修改数据类型
创建DataFrame数组
a = pd.DataFrame(np.arange(12).reshape(3,4))
print(a)
reshape使结果输出3行4列矩阵
注意:要用reshape,就不能用range
结果为:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
在最左侧,最上方的分别是行索引(index),列索引(columns)
因此,还可以如此改变:
a=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('abcd'))
print(a)
结果为:
a b c d
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
使数组倒序
a.sort_index(axis=1,ascending=False)
结果为:
d c b a
a 3 2 1 0
b 7 6 5 4
c 11 10 9 8
acsending=False使其倒序
因为axis=1,所以改变行;如果axis=0,则改变列
也可以用iloc去使列倒序
print(a.iloc[::-1])
结果为:
a b c d
c 8 9 10 11
b 4 5 6 7
a 0 1 2 3
使列倒序
注意:a保持原样,只是输出结果的改变
选择数组中的数据(切片与索引)
位置切片
print(a[0:2])
结果为:
a b c d
a 0 1 2 3
b 4 5 6 7
打印了从第0到1行
使用loc以行为基础提取行和列
loc是结合标签使用的
基本使用
如:
print(a.loc['a'])
这样可以提取标签为a的那一行形成的数组
a 8
b 9
c 10
d 11
Name: c, dtype: int32
进阶使用
如:
print(a.loc['a',['b','c']])
结果为:
b 1
c 2
Name: a, dtype: int32
提取了标签为a的那一行的第b,c列
使用iloc提取以行为基础提取行和列
iloc是结合位置对应数字来使用的
基本用法
print(a.iloc[n])
这样就会提取第n+1行(注意:这个n只能为整数(表示位置))
进阶使用
如:
print(a.iloc[0,[1,2]])
结果为:
b 1
c 2
可见提取了第1行的第2,3个数值
使用条件判断(布尔索引)
基本用法
如:
print(a[a<8])
结果为:
a b c d
a 0.0 1.0 2.0 3.0
b 4.0 5.0 6.0 7.0
c NaN NaN NaN NaN
可见满足条件的数值被保留了,其他的换成了NaN
进阶用法
如果只保留符合条件的部分,如:
print(a[a.a<8])
结果为:
a b c d
a 0 1 2 3
b 4 5 6 7
结合上述的loc,iloc和条件判断
如:
print(a[a<2].iloc[0])
结果为:
a 0.0
b 1.0
c NaN
d NaN
又如:
print(a[a<2].loc['a'])
结果也为:
a 0.0
b 1.0
c NaN
d NaN
修改数值
位置对应数字定位修改
a.iloc[0,1]=10
print(a)
结果为:
a b c d
a 0 10 2 3
b 4 5 6 7
c 8 9 10 11
标签定位修改
a.loc['a','b']=10
print(a)
结果为:
a b c d
a 0 10 2 3
b 4 5 6 7
c 8 9 10 11
条件判断修改
a[a<5]=10
print(a)
结果为:
a b c d
a 10 10 10 10
b 10 5 6 7
c 8 9 10 11
添加一列数据
如:
a['e'] = np.nan
‘=’号后面加序列也可,还可以是Series类型数组
结果为:
a b c d e
a 0 1 2 3 NaN
b 4 5 6 7 NaN
c 8 9 10 11 NaN
如果加Series数组,要对应索引
如:
a['e'] = pd.Series([1,2,3],index=list('abc'))
print(a)
结果为:
a b c d e
a 0 1 2 3 1
b 4 5 6 7 2
c 8 9 10 11 3
否则,会出现:
a b c d e
a 0 1 2 3 NaN
b 4 5 6 7 NaN
c 8 9 10 11 NaN
e列都是NaN
与NaN相关的
删除NaN
使用dropna函数,如:
#导入上面的e列全为NaN的数组
a=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('abcd'))
a['e'] = pd.Series([1,2,3],index=list('abc'))
print(a.dropna(axis=1,how='any'))#any指随机数
结果为:
a b c d
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
填充NaN
print(a.fillna(value=0,axis=0))
#0可以替换为如何数,但输出flaot型
则结果为:
a b c d e
a 0 1 2 3 1.0
b 4 5 6 7 1.0
c 8 9 10 11 1.0
快速检验数组内有无NaN
print(np.any(a.isnull())==True)
结果为:
True
代表该数组中有NaN
其中,如果只用部分函数:
print(a.isnull())
结果为
a b c d e
a False False False False True
b False False False False True
c False False False False True
直接反映具体数值是否为NaN
使用describe函数
在pandas中我们可以使用describe()来输出每列的平均数,个数,极差,最值等数据
print(a.describe())
结果为:
a b c d
count 3.0 3.0 3.0 3.0
mean 4.0 5.0 6.0 7.0
std 4.0 4.0 4.0 4.0
min 0.0 1.0 2.0 3.0
25% 2.0 3.0 4.0 5.0
50% 4.0 5.0 6.0 7.0
75% 6.0 7.0 8.0 9.0
max 8.0 9.0 10.0 11.0
注意:describe只能用于纯数字
结合字典使用
dict1={'name':['Xiaoming','Xiaohong'],'age':[11,12],'gender':['male','female']}
PD = pd.DataFrame(dict1)
print(PD)
结果如下:
name age gender
0 Xiaoming 11 male
1 Xiaohong 12 female
如果数据不全,则会以NaN填充。(NaN就是numpy的nan:not a number)
4、合并数组
先创建数组
a = pd.DataFrame(np.arange(0,9).reshape(3,3),columns=list('abc'))
b = pd.DataFrame(np.arange(9,18).reshape(3,3),columns=list('abc'))
c = pd.DataFrame(np.arange(18,27).reshape(3,3),columns=list('abc'))
print(a)
print(b)
print(c)
结果为:
a b c
0 0 1 2
1 3 4 5
2 6 7 8
a b c
0 9 10 11
1 12 13 14
2 15 16 17
a b c
0 18 19 20
1 21 22 23
2 24 25 26
竖直合并
使用concat
d = pd.concat([a,b,c],axis=0,ignore_index=True)
print(d)
axis=0提供合并方向———竖直
结果为:
a b c
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
4 12 13 14
5 15 16 17
6 18 19 20
7 21 22 23
8 24 25 26
水平合并
使用append
a = pd.DataFrame(np.arange(0,9).reshape(3,3),columns=list('abc'))
b = pd.DataFrame(np.arange(9,18).reshape(3,3),columns=list('cde'))
print(a)
print(b)
结果为:
a b c
0 0 1 2
1 3 4 5
2 6 7 8
d e f
0 9 10 11
1 12 13 14
2 15 16 17
合并
c = pd.concat([a,b],axis=1)
print(c)
结果为:
a b c d e f
0 0 1 2 9 10 11
1 3 4 5 12 13 14
2 6 7 8 15 16 17
合并取相同部分(列名字相同的部分)
创建数组
a = pd.DataFrame(np.arange(0,9).reshape(3,3),columns=list('abc'))
b = pd.DataFrame(np.arange(9,18).reshape(3,3), columns=list('bcd'))
print(a)
print(b)
结果为:
a b c
0 0 1 2
1 3 4 5
2 6 7 8
b c d
0 9 10 11
1 12 13 14
2 15 16 17
使用inner:
c = pd.concat([a,b],join='inner',ignore_index=True)
print(c)
结果为:
b c
0 1 2
1 4 5
2 7 8
3 9 10
4 12 13
5 15 16
使用merge合并
merge合并要基于某列相等
a = pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
b = pd.DataFrame({'b':[7,5,6],'c':[4,5,6]})
c = pd.merge(a,b,on='b',how='outer')
print(c)
结果为:
a b c
0 1.0 4 NaN
1 2.0 5 5.0
2 3.0 6 6.0
3 NaN 7 4.0
保留了b中相同的部分并在最后添加二者的非公共部分
而添加后空的为用NaN表示
如果outer换成inner
结果为:
a b c
0 2 5 5
1 3 6 6
只保留了公共部分
如果换成left
结果为:
a b c
0 1 4 NaN
1 2 5 5.0
2 3 6 6.0
就保留了a的数组,b的c列保留可对应部分
换成right的同理
5、读取与保存外部数据
读取
pd.read_format(fname)
format填入对应格式,fname填入对应路径名
保存
pd.to_format(fname)
用法与read类似
可读类型
类型 |
---|
csv |
excel |
hdf |
sql |
json |
msgpack |
html |
gbq |
sas |
clipboard |
pickle |