【AI_常用Python库】Pandas库

这一篇博文是【 AI学习路线图】系列文章的其中一篇,点击查看目录:AI学习完整路线图

1、 基本数据结构

pandas中有两种数据结构:Series和DataFrame。
- Series类似于一维数组,是由一组数据(类型值)以及一组与之相关的数据标签(索引)组成。
- DataFrame一个表格型的数据结构,每一列的值类型可以不同,DataFrame既有行的索引也有列的索引,可以被看做是由Series组成的字典。

2、 Series

series 是一种一维的数据类型,其中的每个元素都有各自的标签。标签可以是数字或者字符。

(1) 通过一维数组创建

##引入pandas
import numpy as np
import pandas as pd

#定义一个一维数组,通过一维数组来创建Series
arr=np.array([1,3,5,np.NaN,10])
#创建一个Series
series1=pd.Series(arr)
print(series1)

#Series的数据类型
print(series1.dtype)
#Series的索引值
print(series1.index)
#Series的值
print(series1.values)
输出:
0     1.0
1     3.0
2     5.0
3     NaN
4    10.0
dtype: float64
float64
RangeIndex(start=0, stop=5, step=1)
[  1.   3.   5.  nan  10.]

(2) 修改索引值

# 通过一维数组,创建一个Series
series2 = pd.Series([87, 90, 89])
#默认的Series索引是从0开始,步长为1的数字序列
print("默认的series2:")
print(series2)

# 修改索引值
series2.index = ['语文', '数学', '英语']
print("修改后的series2:\n", series2)
# 创建Series时指定值和索引
series3 = pd.Series(data=[89, 90, 95.], dtype=np.int64, index=['语文', '数学', '英语'])
print("series3:\n", series3)
输出:
默认的series2:
0    87
1    90
2    89
dtype: int64
修改后的series2:
 语文    87
数学    90
英语    89
dtype: int64
series3:
 语文    89
数学    90
英语    95
dtype: int64

(3) 通过字典方式创建

print("-----使用字典方式创建Series-----------")
series4=pd.Series({'语文':90,'数学':85,'英语':100})
print(series4)
print("dtype:",series4.dtype)
print("index:",series4.index)
print("values:",series4.values)
输出:
-----使用字典方式创建Series-----------
数学     85
英语    100
语文     90
dtype: int64
dtype: int64
index: Index(['数学', '英语', '语文'], dtype='object')
values: [ 85 100  90]

(4) Series数据的读取

有两种数据读取方式:方括号+索引、方括号+下标值

series4 = pd.Series({'语文': 90, '数学': 85, '英语': 100})
print("Series为:")
print(series4)

# 索引值读取
print(series4['语文'])
# 下标值读取
print(series4[0])

print("切片1:")
# 切片包括边界值
print(series4['英语':'语文'])

print("切片2:")
# 切片不包括结束值
print(series4[1:2])
Series为:
数学     85
英语    100
语文     90
dtype: int64
90
85
切片1:
英语    100
语文     90
dtype: int64
切片2:
英语    100
dtype: int64

(5) Series运算

Series是numpy的升级版,numpy的运算series也可以进行运算。

(6) series自动对齐

当多个series对象之间进行运算时,series之间会根据索引值自动对齐后进行相应的运算,如果对应不上,结果就为NaN。

print("-------series自动对齐----------------")
arr1 = pd.Series([12, 23, 34], index=['p1', 'p2', 'p3'])
arr2 = pd.Series([54, 43, 32, 27], index=['p2', 'p3', 'p4', 'p5'])

# 两个series相加,是对应的索引的相加,对应不上的,结果为NaN
print("相加结果")
print(arr1 + arr2)
print("相乘结果")
print(arr1 * arr2)
print("相除结果")
print(arr1 / arr2)
-------series自动对齐----------------
相加结果
p1     NaN
p2    77.0
p3    77.0
p4     NaN
p5     NaN
dtype: float64
相乘结果
p1       NaN
p2    1242.0
p3    1462.0
p4       NaN
p5       NaN
dtype: float64
相除结果
p1         NaN
p2    0.425926
p3    0.790698
p4         NaN
p5         NaN
dtype: float64

(7) series的name,索引的name

Series对象本身有一个name属性,默认为空,index也有一个name属性。

print("-----nane属性-----------")
series4 = pd.Series({'语文': 90, '数学': 85, '英语': 100})
series4.name='考试成绩'
series4.index.name='科目'
print(series4)

-----nane属性-----------
科目
数学     85
英语    100
语文     90
Name: 考试成绩, dtype: int64

(8) 缺失值检测

pandas中有isnull和notnull两个函数,用于检测Series中缺失值,他们都返回一个布尔类型的Series

print("-----缺失值检测-----------")
series4 = pd.Series({'语文': 90, '数学': 85, '英语': np.NaN})
print("    ---检测各个值是否为空:")
print(pd.isnull(series4))

print("    ---返回为空的值:")
print(series4[pd.isnull(series4)])

print("    ---检测各个值是否为不为空:")
print(pd.notnull(series4))

print("    ---返回不为空的值:")
print(series4[pd.notnull(series4)])

-----缺失值检测-----------
    ---检测各个值是否为空:
数学    False
英语     True
语文    False
dtype: bool
    ---返回为空的值:
英语   NaN
dtype: float64
    ---检测各个值是否为不为空:
数学     True
英语    False
语文     True
dtype: bool
    ---返回不为空的值:
数学    85.0
语文    90.0
dtype: float64

3、 DataFrame

dataframe 是一个二维的、表格型的数据结构。行轴有标签,列轴也有标签。可以把它当作一个 series 的字典。

(1) 创建DataFrame

import numpy as np
import pandas as pd

data = np.array([
    [90, 80, 70],
    [60, 50, 40],
    [30, 20, 10]]
)

# 定义一个dataframe,默认的行索引和列索引都是数字
print("默认方式创建DataFrame")
df1 = pd.DataFrame(data)
print(df1)

# 定义一个dataframe,指定行索引和列索引
print("指定列索引和行索引")
df1 = pd.DataFrame(data=data,
                   columns=['语文', '数学', '英语'],
                   index=['张三', '李四', '王五'])
print(df1)
  0   1   2
0  90  80  70
1  60  50  40
2  30  20  10
    语文  数学  英语
张三  90  80  70
李四  60  50  40
王五  30  20  10

(2) 读取数据

df1 = pd.DataFrame(data=data,
                   columns=['语文', '数学', '英语'],
                   index=['张三', '李四', '王五'])
print("----------------2-----------")
print(df1)

print('列:----')
#查询某一列的数据
print(df1['数学'])
print('行:----')
#查询某一行的数据
print(df1.ix['李四'])
#修改列的值
df1["数学"]=[1,2,3]
#修改行的值
df1.ix['李四']=[11,12,13]
print("修改后的:")
print(df1)

输出:
----------------2-----------
    语文  数学  英语
张三  90  80  70
李四  60  50  40
王五  30  20  10
列:----
张三    80
李四    50
王五    20
Name: 数学, dtype: int32
行:----
语文    60
数学    50
英语    40
Name: 李四, dtype: int32
修改后的:
    语文  数学  英语
张三  90   1  70
李四  11  12  13
王五  30   3  10

4、 常用方法

4.1 数学统计方法

方法 说明
count 计算非NaN值的数量
describe 针对Series或者各DataFrame列计算总统计值
min/max 计算最大值、最小值
argmin/argmax 计算最大值、最小值索引的位置
idxmin/idxmax 计算最大值、最小值索引值
quantile 计算样本的分位数
sum 值的总和
mean 值的平均值
median 值的中位数

4.2 DataFrame 常用方法

header 方法名 header 说明
head(num) 返回前面的num行数据
tail(num) 返回最后的num行数据
len() 返回有多少行数据
describe() 返回数据的一些基本的统计信息
import pandas as pd

# 用read_csv方法读取文件内容
df = pd.read_csv("ca_list_copy(2).csv")
print(df.head(3))
print(df.tail(3))
print("数据行数:",df.__len__())
print(df.describe())

#读取txt文件
dftxt = pd.read_csv('data.txt', sep=',', header=None)
dftxt.columns=['id','姓名','年龄']
print(dftxt)

5、 过滤与索引

5.1 过滤

pandas可以对DataFrame结构,根据值过滤。

import pandas as pd

# 用read_csv方法读取文件内容
df = pd.read_csv("ca_list_copy(2).csv")

#通过值过滤,并的关系用 &
print(df[(df.zwyx > 35000)
         & (df.Id > 1000)
         & (df.zwmc.str.startswith('数据分析'))])

5.1 行列索引

import pandas as pd

# 用read_csv方法读取文件内容
df = pd.read_csv("ca_list_copy(2).csv")

#列索引
print(df['zwyx'])
print(df.zwyx)

#行索引
print(df.iloc[10])
print(df.loc[10])

#根据索引排序
print(df.sort_index(ascending=False).head(5))

5.3 层次索引

可以给Series设置一个多层索引,可以看做多级分类,可以根据分类(层次)来索引出这个分类下的所有数据。

举例:

import pandas as pd

# 层次索引,2001,2002是第一层
data = pd.Series([22.1, 44, 88, 98.5, 30],
                 index=[
                     [2001, 2001, 2001, 2002, 2002],
                     ['苹果', '香蕉', '西瓜', '苹果', '西瓜']
                 ]
                 )
print(data)

print("层次索引取值:\n---------")
print(data[2002])
print(data[2002]["西瓜"])

##--------------------------------
输出:
2001  苹果    22.1
      香蕉    44.0
      西瓜    88.0
2002  苹果    98.5
      西瓜    30.0
dtype: float64
层次索引取值:

苹果    98.5
西瓜    30.0
dtype: float64
30.0

6、从文件中读取数据

pandas可以从csv、txt、xlsx等文件中导入数据。

例子:

# 用read_csv方法读取文件内容
#header=0指定第0行是列名称,如果省略header参数,默认第一列是列名。
#如果没有列名,header='None'
df1 = pd.read_csv("ca_list_copy(2).csv", header=0)

7、DataFrame分组

参考链接:https://my.oschina.net/lionets/blog/280332

8、合并数据集

对于两个相关的数据集,可以根据某一列对它们进行合并,类似于MySQL里的join。
下面是一个实例

import pandas as pd

df1 = pd.DataFrame([
    [1, '张三'],
    [2, '李四'],
    [3, '王五']
],
    columns=['id', '姓名'])

df2 = pd.DataFrame([
    [1, 18],
    [3, 24],
    [4, 28]
],
    columns=['id', '年龄'])

#根据一个字段join两个集合
df = df1.merge(df2, on='id')
print(df)

======================
结果是:
id  姓名  年龄
0   1  张三  18
1   3  王五  24

9、空值替换

对于DataFrame或者Series中的NaN值,一般采取的方式是删除对应的行或者列,或者填充一个默认值。
有几个方法可以实现以上的操作:

方法 说明
dropna 根据标签的值中是否存在缺失数据,对轴标签进行删除,可以通过参数调解对缺失值的容忍度
fillna 用指定值或者插值的方式填充缺失的数据,比如:ffill或者bfill
isnull 返回一个含有布尔值的对象,这些布尔值表示哪些值是确实只NA
notnull isnull的否定式

实例:


import numpy as np
import pandas as pd

# 定义一个有NaN值的DataFrame
df = pd.DataFrame([
    ['Tom', np.NaN, 456.67, 'M'],
    ['Merry', 34, 456.67, np.NaN],
    [np.NaN, np.NaN, np.NaN, np.NaN],
    ['John', 23, np.NaN, 'M'],
    ['Joe', 18, '2300', 'F']
],
    columns=['姓名', '年龄', '工资', '性别']
)
print("原DataFrame\n",df)

# 判断每个元素是否是NaN
print(df.isnull())

# 判断每个原始是否不是NaN
print(df.notnull())

# dropna默认是将包含NaN值的行整个删除
print(df.dropna())

# 如果行里都是NaN值,才删除行
print(df.dropna(how='all'))

# 按维度删除
print(df.dropna(axis=0, how='all'))

# 对空值进行填充。
print(df.fillna(999999))

10、快速作图

Pandas可以通过plot快速绘图,功能并不如Matplotlib强大,但是可以粗略地看下数据图。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("ca_list_copy(2).csv")
df.plot(x='Id',y='zwyx')
plt.show()

你可能感兴趣的:(AI,AI相关技术)