Pandas

0

Pandas介绍

  pandas是基于Numpy的一种工具,该工具纳入了大量库和一些标准的数据模型,提供了大量能使我们快速便捷地处理数据的函数和方法。

Pandas特点

  Pandas解决了Numpy不利于处理数据结构的问题
  Pandas能够合并处理常见数据库中的关系型运算
  Pandas更贴近于日常的生活使用,即表格化的数据形式
  Pandas具备数据对齐功能,且集成时间序列,既能处理时间序列数据,也能处理非时间序列数据

Pandas应用

Pandas创建表格

series方法

1
2
3
4
5
6
7
8
import pandas as pd

# pd.Series(list, index) 将list转换为一维表格型数据结构,index为标签名称,默认从0开始0,1, ...
a = pd.Series([1, 'hello', 3.1415, True])
b = pd.Series([1, 'hello', 3.1415, True], index=['int', 'string', 'float', 'bool'])

# pd.Series(dict) 将dict转换为一维表格型数据结构
c = pd.Series({'int':1, 'string':'hello', 'float':3.1415, 'bool':True})

1

DataFrame方法

1
2
3
4
5
6
7
8
import pandas as pd
import numpy as np

# pd.DataFrame(array, index, columns) 生成行标签为index,列标签为columns,数据为array的二维表格型数据结构
a = pd.DataFrame(np.arange(12).reshape(3, 4), index=['row_0', 'row_1', 'row_2'], columns=['columns_0', 'columns_1', 'columns_2', 'columns_3'])

# pd.DataFrame(dict, index) 生成行标签为index,数据为dict的二维表格型数据结构,dict中的每一个key是每一列的列标签,value是每一列的数据
b = pd.DataFrame({'columns_0':[0, 4, 8], 'columns_1':[1, 5, 9], 'columns_2':[2, 6, 10], 'columns_3':[3, 7, 11]}, index=['row_0', 'row_1', 'row_2'])

2

Pandas属性

dtypes,index,columns,values属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd

a = pd.DataFrame({'col_0':[0, 4, 8], 'col_1':[2.71, 3.14, 5], 'col_2':[True, False, False]}, index=['row_0', 'row_1', 'row_2'])

# obj.dtypes 查看每一列的数据形式
a.dtypes

# obj.index 查看列的序号
a.index

# obj.columns 查看行的序号
a.columns

# obj.values 查看列表中的数据内容
a.values

3

describe,head,tail属性

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd

a = pd.DataFrame({'col_0':[0, 4, 8], 'col_1':[2.71, 3.14, 5], 'col_2':[True, False, False]}, index=['row_0', 'row_1', 'row_2'])

# obj.describe() 查看内容统计,只统计数字内容
a.describe()

# obj.head(n) 查看前n行
a.head(2)

# obj.tail(n) 查看后n行
a.tail(2)

4

Pandas表格排序

sort_index方法

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np

np.random.seed(1)

a = pd.DataFrame(np.random.randint(1, 6, (3, 4)), index=['row_2', 'row_1', 'row_3'], columns=['col_2', 'col_0', 'col_3', 'col_1'])

# obj.sort_index(axis=0, ascending=True) 对obj的标签进行排序,axis=0(默认)为行标签,axis=1为列标签,ascending=True(默认)为递增顺序,ascending=False为递减顺序
b = a.sort_index()
c = a.sort_index(axis=1, ascending=False)

5

sort_values方法

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np

np.random.seed(1)

a = pd.DataFrame(np.random.randint(1, 6, (3, 4)), index=['row_2', 'row_1', 'row_3'], columns=['col_2', 'col_0', 'col_3', 'col_1'])

# obj.sort_values(by, axis=0, ascending) 对obj的数据内容进行排序,by指定要排序的行或者列,axis=0(默认)为行标签,axis=1为列标签,ascending=True(默认)为递增顺序,ascending=False为递减顺序
b = a.sort_values(by='col_0')
c = a.sort_values(by='row_1', axis=1, ascending=False)

6

pandas切片与索引

[]方法

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
import numpy as np

a = pd.DataFrame(np.arange(12).reshape(3, 4), index=['row_0', 'row_1', 'row_2'], columns=['col_0', 'col_1', 'col_2', 'col_3'])

# obj[col_name] 索引obj中的col_name列
b = a[['col_3', 'col_0']]

# obj[m:n] 索引obj中的[m, n)行
c = a[1:3]

# obj[obj.col_name op x] 索引obj的col_name列中对x操作后为True的行
d = a[a.col_0 > 3]

7

loc,iloc方法

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np

a = pd.DataFrame(np.arange(12).reshape(3, 4), index=['row_0', 'row_1', 'row_2'], columns=['col_0', 'col_1', 'col_2', 'col_3'])

# obj.loc[row_name,col_name=None] 索引obj中行标签为row_name,列标签为col_name(默认是全部列)的所有数据
b = a.loc[['row_1', 'row_2']]

# obj.iloc[row_index, col_index] 索引obj中的第row_index行和第col_index列
c = a.iloc[[1, 2], [1, 2]]

8

pandas修改内容

[]方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd
import numpy as np

a = pd.DataFrame(np.arange(12).reshape(3, 4), index=['row_0', 'row_1', 'row_2'], columns=['col_0', 'col_1', 'col_2', 'col_3'])

# obj[col_name] 将obj中的col_name列中的数据改为x
a[['col_3','col_2']] = -1

# obj[m:n] = x 将obj中的[m, n)行中的所有数据改为x
a[2:3] = -2

# obj[obj[col_name] op x] = x 将obj的col_name列中对x操作后为True的行中的所有数据改为x
a[a['col_0'] > 3] = -3

# obj.col_name[obj.col_name op x] = x 将obj的col_name列中对x操作后为True的所有数据改为x
a.col_0[a['col_0'] != -3] =-4

# obj[col_name] = x 将obj的col_name列修改为x,如果没有该列则增加一列
a['col_4'] =-5

9

dropna,fillna方法

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
import numpy as np

a = pd.DataFrame({'col_0':[0, 4, np.nan], 'col_1':[2.71, np.nan, np.nan], 'col_2':[np.nan, np.nan, np.nan]}, index=['row_0', 'row_1', 'row_2'])
b = pd.DataFrame({'col_0':[0, 4, 2.5], 'col_1':[2.71, np.nan, np.nan], 'col_2':[np.nan, np.nan, np.nan]}, index=['row_0', 'row_1', 'row_2'])

# obj.dropna(axis=0, how='any') 将obj中的nan删除,axis=0(默认)为删除行,axis=1为删除列,how='any'(默认)为只要存在nan就删除,how='all'为全部为nan才删除
c = a.dropna()
d = b.dropna(1, 'all')

# obj.fillna(value) 将obj中的nan用value填充,value可以为数字或者字典,如果是字典则按照字典的对应关系按列填充
e = a.fillna(-1)
f = a.fillna({'col_0':-1, 'col_1':-2, 'col_2':-3})

10

pandas合并

concat方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd
import numpy as np

index_a = ['A', 'B']
index_b = ['B', 'C']
col_a = ['a', 'b']
col_b = ['b', 'c']
a = pd.DataFrame(np.arange(4).reshape(2, 2), index=index_a, columns=col_a)
b = pd.DataFrame(np.arange(4).reshape(2, 2), index=index_b, columns=col_b)

# pd.concat([obj1, obj2, ...], axis=0, join='outer', ignore_index=False) 将多个对象按照轴进行连接,join为连接方式,'outer'代表将没有相应标签的对象补NaN,'inner'代表只保留共有的标签,ignore_index为是否重新开始排列标签
c = pd.concat([a, b])
d = pd.concat([a, b], axis=1)
e = pd.concat([a, b], join='inner')
f = pd.concat([a, b],ignore_index=True)

11

append方法

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
import numpy as np

index_a = ['A', 'B']
index_b = ['B', 'C']
col_a = ['a', 'b']
col_b = ['b', 'c']
a = pd.DataFrame(np.arange(4).reshape(2, 2), index=index_a, columns=col_a)
b = pd.DataFrame(np.arange(4).reshape(2, 2), index=index_b, columns=col_b)

# obj.append([obj1, obj2, ...], ignore_index=False) 在纵向在obj后追加obj1, obj2,......,如果没有对应的列标签,则补NaN
c = a.append([a])
d = a.append([b])

12

merge方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np

index_a = ['A', 'B']
index_b = ['B', 'C']
col_a = ['a', 'b']
col_b = ['b', 'c']
a = pd.DataFrame(np.array([1, 3, 5, 7]).reshape(2, 2), index=index_a, columns=col_a)
b = pd.DataFrame(np.array([3, 4, 5, 6]).reshape(2, 2), index=index_b, columns=col_b)

# pd.merge(left, right, how='inner', on='col_name',left_index=False,right_index=False) 按照on进行合并两个表格,how='inner',行标签为两个表格行标签的交集,'outer',行标签为两个表格行标签的并集,将不相交的部分取NaN,'left',行标签为left的行标签,'right',行标签为left的行标签。left_index和right_index指是否按照标签合并,为False根据值合并表格,True根据标签合并表格
c = pd.merge(a, b, on='b')
d = pd.merge(a, b, how='outer', on='b')
e = pd.merge(a, b, how='left', on='b')
f = pd.merge(a, b, how='right', on='b')
g = pd.merge(a, b, how='outer', left_index=True,right_index=True)

13

Pandas修改行列名

replace,rename方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd

a = pd.DataFrame([[1, 3], [5, 7]], index=['row_0', 'row_1'], columns=['col_0', 'col_1'])

# obj.columns = list,obj.index = list 将列标签改为list,将行标签改为list
a.columns = ['new_col_0', 'new_col_1']
a.index = ['new_row_0', 'new_row_1']

# obj.replace(list1, list2) 将obj中list1中的数值替换为list2
b = a.replace([1, 7], [2, 6])

# obj.rename(columns=dict/func, index=dict/func) 用字典或函数来更改行列名
c = a.rename(columns={'new_col_0':'A', 'new_col_1':'B'}, index={'new_row_0':'a', 'new_row_1':'b'})
d = a.rename(columns=lambda x: x[-1], index=lambda x: x[-1])

14

pandas数理统计

notnull,isnull方法

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np

a = pd.DataFrame([[1, np.nan], [5, 7]], index=['row_0', 'row_1'], columns=['col_0', 'col_1'])

# obj.isnull() 判断obj中每一项是否为NaN
a.isnull()

# obj.notnull() 判断obj中每一项是否不为NaN
a.notnull()

15

统计方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pandas as pd
import numpy as np

a = pd.DataFrame([[1, 4, 7], [2, 5, 8], [5, 4, 1]], index=['r_0', 'r_1', 'r_2'], columns=['c_0', 'c_1', 'c_2'])
b = pd.DataFrame([[1, 4, 7], [2, np.nan, 8], [5, np.nan, np.nan]], index=['r_0', 'r_1', 'r_2'], columns=['c_0', 'c_1', 'c_2'])

# obj.max/min(axis=0) 统计最大值/最小者,axis=0为列,axis=1为行
a.max(0)
a.min(1)

# obj.count(axis=0) 统计非空个数,axis用法同pd.max
b.count()

# obj.mean(axis=0) 统计均值,axis用法同pd.max
a.mean()

# obj.median(axis=0) 统计中位数,axis用法同pd.max
a.median()

# obj.std(axis=0) 统计标准差,axis用法同pd.max
a.std()

# obj.var(obj, axis=None) 统计方差,axis用法同pd.max
a.var()

# obj.corr(obj, axis=None) 统计相关系数,axis用法同pd.max
a.corr()

16

pandas数据保存

to_csv,read_csv方法

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np

a = pd.DataFrame(np.arange(12).reshape(3, 4), index=['row_0', 'row_1', 'row_2'], columns=['col_0', 'col_1', 'col_2', 'col_3'])

# obj.to_csv/pickle(filename) 将obj保存在文件名为filename的.csv/pickle文件中(要加.csv/pickle扩展名)
a.to_csv('save1.csv')
a.to_pickle('save2.pickle')

# pd.read_csv(filename) 读取文件名为filename的数组数据(要加.csv/pickle扩展名)
b = pd.read_csv('save1.csv')
c = pd.read_pickle('save2.pickle')

17

pandas数据显示

plot,plot.scatter方法

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

x = np. arange(10)
y = np.log(x)
a = pd.DataFrame({'x':x, 'y':y})

# obj.plot.scatter(x, y) 画出x-y对应的散点图,可参考matplotlib
a.plot.scatter('x', 'y')

plt.show()

18

Pandas小结

  Pandas可处理的数据更接近来源于生活中的数据,在数据分析,机器学习中,大量的数据都是具有标签的,不只是纯数字的数据,需要借助Pandas的帮助,因此pandas也作为机器学习三剑客之一。

-------------本文结束感谢您的阅读-------------
0%