Bootstrap

python37使用教程_python学习笔记37:pandas

pandas

series:一维数据结构

dataframe:二维数据结构

import pandas as pd

Series方式

参数说明:

data

index 索引

name 名称

copy 是否复制

dtype 数据类型

ser_obj = pd.Series([1,2,3])

ser_obj

0 1

1 2

2 3

dtype: int64

# 指定索引

ser_obj = pd.Series([1,2,3],index=['a','b','c'])

ser_obj

a 1

b 2

c 3

dtype: int64

# 从字典创建

dit = {2001:100,2002:200,2003:150}

ser_obj1 = pd.Series(dit)

ser_obj1

2001 100

2002 200

2003 150

dtype: int64

Dataframe方式

参数说明:

data

index 索引

columns 行索引

copy 是否复制

dtype 数据类型

import numpy as np

data = np.arange(6).reshape(2,3)

df_obj = pd.DataFrame(data)

df_obj

0

1

2

0

0

1

2

1

3

4

5

data = np.arange(6).reshape(2,3)

df_obj = pd.DataFrame(data,columns=['a','b','c'])

df_obj

a

b

c

0

0

1

2

1

3

4

5

# 增加一列

df_obj['d'] = [1,2]

df_obj

a

b

c

d

0

0

1

2

1

1

3

4

5

2

# 删除一列

del df_obj['a']

df_obj

b

c

d

0

1

2

1

1

4

5

2

# 重置索引

ser_obj1 = pd.Series([1,2,3,4],index=['c','b','a','d'])

ser_obj1

c 1

b 2

a 3

d 4

dtype: int64

# fill_value会让所有缺失值都用同一个值填充

ser_obj2 = ser_obj1.reindex(['a','b','c','d','e','f'],fill_value=5)

ser_obj2

a 3

b 2

c 1

d 4

e 5

f 5

dtype: int64

# ffill\pad 前向填充值

# bfill\backfill 后向填充值

# nearest 从最近的索引值填充

ser_obj3 = pd.Series([1,3,5,7], index=[0,2,4,6])

ser_obj3

0 1

2 3

4 5

6 7

dtype: int64

ser_obj3.reindex([1,2,3,4,5,6],method='bfill')

ser_obj3

0 1

2 3

4 5

6 7

dtype: int64

索引

arr = np.arange(12).reshape(3,4)

df_obj = pd.DataFrame(arr, columns=['a','b','c','d'])

df_obj

a

b

c

d

0

0

1

2

3

1

4

5

6

7

2

8

9

10

11

df_obj['a']

0 0

1 4

2 8

Name: a, dtype: int64

df_obj[0:1]

a

b

c

d

0

0

1

2

3

# 多列,以列表方式传入

df_obj[['a','c']]

a

c

0

0

2

1

4

6

2

8

10

# loc和iloc

df_obj.loc[:,['c','a']]

c

a

0

2

0

1

6

4

2

10

8

df_obj.iloc[:,[2,0]]

c

a

0

2

0

1

6

4

2

10

8

算术运算和数据对齐

# 先对齐在运算

obj_one = pd.Series(range(10,13),index=range(3))

obj_one

0 10

1 11

2 12

dtype: int64

obj_two = pd.Series(range(10,16),index=range(6))

obj_two

0 10

1 11

2 12

3 13

4 14

5 15

dtype: int64

# 没有用NaN补充,也可以设置fill_value

obj_one + obj_two

0 20.0

1 22.0

2 24.0

3 NaN

4 NaN

5 NaN

dtype: float64

obj_one.add(obj_two,fill_value=0)

0 20.0

1 22.0

2 24.0

3 13.0

4 14.0

5 15.0

dtype: float64

数据排序

# 按索引

ser_obj = pd.Series(range(10,13),index=range(3))

ser_obj

0 10

1 11

2 12

dtype: int64

ser_obj.sort_index(ascending=False)

2 12

1 11

0 10

dtype: int64

参数说明:

axis 0 行1列

level 指定索引级别排序

ascending 默认升

inplace 默认False,不创建新的实例

kind 排序算法,如quicksort

# 按值

ser_obj = pd.DataFrame(np.arange(12).reshape(3,4))

ser_obj

0

1

2

3

0

0

1

2

3

1

4

5

6

7

2

8

9

10

11

ser_obj[4] = [12,3,2]

ser_obj

0

1

2

3

4

0

0

1

2

3

12

1

4

5

6

7

3

2

8

9

10

11

2

ser_obj.sort_values(by=4)

0

1

2

3

4

2

8

9

10

11

2

1

4

5

6

7

3

0

0

1

2

3

12

常用统计计算

sum 和

mean 均值

medium 中值

idxmax 最大值索引

idxmin

count 非NaN的值的个数

var 样本方差值

std 标准差

cumsum 累计求合

cumprod 累计求积

describe 列计算汇总统计

层次化索引

df_obj = pd.DataFrame({'学生数':[1,2,3,4]},

index=[['学校1','学校1','学校2','学校2'],['班级1','班级2','班级1','班级2']])

df_obj

学生数

学校1

班级1

1

班级2

2

学校2

班级1

3

班级2

4

from pandas import MultiIndex

# 三种转化为层次索引的方法

# MultiIndex.from_arrays

# MultiIndex.from_product

# MultiIndex.from_tuples

# 方式1

list_tuple = [('学校1','班级1'),('学校1','班级2'),('学校2','班级1'),('学校2','班级2')]

m_index = MultiIndex.from_tuples(tuples=list_tuple)

m_index

MultiIndex(levels=[['学校1', '学校2'], ['班级1', '班级2']],

codes=[[0, 0, 1, 1], [0, 1, 0, 1]])

df_obj = pd.DataFrame({'学生数':[1,2,3,4]},

index = m_index)

df_obj

学生数

学校1

班级1

1

班级2

2

学校2

班级1

3

班级2

4

# 方式2

schools = ['学校1', '学校2']

classes = ['班级1', '班级2']

m_index = MultiIndex.from_product(iterables=[schools,classes])#,names=['school','class'])

df_obj = pd.DataFrame({'学生数':[1,2,3,4]},

index = m_index)

df_obj

学生数

学校1

班级1

1

班级2

2

学校2

班级1

3

班级2

4

层次索引操作

# df_obj['学校1']

读写

pd.read_csv() 默认使用“,”做分割符号

pd.to_csv()

pd.read_table() 默认使用“\t”做分割符号

pd.read_excel()

# 由于表格有多个列标题,所以用header=[0,1]表示前两行都是列标签

df_obj = pd.read_excel('scores.xlsx',header=[0,1],index_col=0)

df_obj

年份

一本分数线

二本分数线

文科

理科

文科

理科

2018

576

532

488

432

2017

555

537

468

439

2016

583

548

532

494

2015

579

548

527

495

2014

565

543

507

495

2013

549

550

494

505

2012

495

477

446

433

2011

524

484

481

435

2010

524

494

474

441

2009

532

501

489

459

2008

515

502

472

455

2007

528

531

486

478

2006

516

528

476

476

# 获取历年文理科最高和最低分数线及极差

df_obj.max()

年份

一本分数线 文科 583

理科 550

二本分数线 文科 532

理科 505

dtype: int64

df_obj.min()

年份

一本分数线 文科 495

理科 477

二本分数线 文科 446

理科 432

dtype: int64

df_obj["一本分数线","文科"].ptp()

/Users/zxx/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: Method .ptp is deprecated and will be removed in a future version. Use numpy.ptp instead.

"""Entry point for launching an IPython kernel.

88

df_obj.describe()

年份

一本分数线

二本分数线

文科

理科

文科

理科

count

13.000000

13.000000

13.000000

13.000000

mean

541.615385

521.153846

487.692308

464.384615

std

28.150010

25.986683

23.570407

27.274953

min

495.000000

477.000000

446.000000

432.000000

25%

524.000000

501.000000

474.000000

439.000000

50%

532.000000

531.000000

486.000000

459.000000

75%

565.000000

543.000000

494.000000

494.000000

max

583.000000

550.000000

532.000000

505.000000

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;