数据分析三——pandas

三、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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值