14 2 2019

为什么学习pandas

  • numpy已经可以帮助我们进行数据的处理了,那么学习pandas的目的是什么呢?

    • numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类型的数据(字符串,时间序列),那么pandas就可以帮我们很好的处理除了数值型的其他数据!

什么是pandas?

  • 首先先来认识pandas中的两个常用的类

    • Series

    • DataFrame

import pandas as pd
from pandas import Series,DataFrame
import numpy as np

Series

  • Series是一种类似与一维数组的对象,由下面两个部分组成:

    • values:一组数据(ndarray类型)

    • index:相关的数据索引标签

  • Series的创建

    • 由列表或numpy数组创建

    • 由字典创建

Series(data=[1,2,3,4,5])

 

0    1
1    2
2    3
3    4
4    5
dtype: int64

 

Series(data=np.random.randint(0,100,size=(4,)))

 

0    63
1    45
2    91
3    12
dtype: int64

 

dic = {
    '语文':100,
    '数学':120
}
Series(data=dic)

 

语文    100
数学    120
dtype: int64

 

#隐式索引:默认索引。0,1,2,3,4
#显式索引:自定义的索引
s = Series(data=[1,2,3,4,5],index=['A','B','C','D','E'])
  • Series的索引和切片

s[0]

 

1

 

s['C']

 

3

 

s.C

 

3

 

s[0:2]

 

A    1
B    2
dtype: int64

 

s['A':'C']

 

A    1
B    2
C    3
dtype: int64

 

  • Series的常用属性

    • shape

    • size

    • index

    • values

s.shape

 

(5,)

 

s.size

 

5

 

s.index

 

Index(['A', 'B', 'C', 'D', 'E'], dtype='object')

 

s.values

 

array([1, 2, 3, 4, 5])

 

  • Series的常用方法

    • head(),tail()

    • unique()

    • isnull(),notnull()

    • add() sub() mul() div()

s.head(2) #显示前两个元素
s.tail(2) #显示后两个元素

 

D    4
E    5
dtype: int64

 

s = Series(data=[1,1,2,2,3,3,4,4,5,6,7,8,9])
s

 

0     1
1     1
2     2
3     2
4     3
5     3
6     4
7     4
8     5
9     6
10    7
11    8
12    9
dtype: int64

 

s.unique() #去重

 

array([1, 2, 3, 4, 5, 6, 7, 8, 9])

 

  • Series的算术运算

    • 法则:索引一致的元素进行算数运算否则补空

s1 = Series(data=[1,2,3,4,5])
s2 = Series(data=[1,2,3])
s = s1 + s2
s

 

0    2.0
1    4.0
2    6.0
3    NaN
4    NaN
dtype: float64

 

s.isnull() #isnull检测哪些元素为空值

 

0    False
1    False
2    False
3     True
4     True
dtype: bool

 

s.notnull()

 

0     True
1     True
2     True
3    False
4    False
dtype: bool

 

#想要去除Seriese中的空值
s[[True,True,True,False,False]]

 

0    2.0
1    4.0
2    6.0
dtype: float64

 

s[s.notnull()] 

 

0    2.0
1    4.0
2    6.0
dtype: float64

 

DataFrame

  • DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

    • 行索引:index

    • 列索引:columns

    • 值:values

  • DataFrame的创建

    • ndarray创建

    • 字典创建

DataFrame(data=[[1,2,3],[4,5,6]])

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  0 1 2
0 1 2 3
1 4 5 6

</div>

 

DataFrame(data=np.random.randint(0,100,size=(6,5)))

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  0 1 2 3 4
0 53 18 50 75 96
1 77 74 38 9 67
2 43 42 39 55 28
3 87 31 68 36 79
4 26 92 80 29 15
5 32 61 43 28 1

</div>

 

dic = {
    'name':['jay','tom','bobo'],
    'salary':[1000,2000,1500]
}
df = DataFrame(data=dic,index=['A','B','C'])
df

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  name salary
A jay 1000
B tom 2000
C bobo 1500

</div>

 

  • DataFrame的属性

    • values、columns、index、shape

df.values

 

array([['jay', 1000],
       ['tom', 2000],
       ['bobo', 1500]], dtype=object)

 

df.columns

 

Index(['name', 'salary'], dtype='object')

 

df.index

 

Index(['A', 'B', 'C'], dtype='object')

 

df.shape

 

(3, 2)

 

============================================

练习4:

根据以下考试成绩表,创建一个DataFrame,命名为df:

    张三  李四  
语文 150  0
数学 150  0
英语 150  0
理综 300  0

============================================

dic = {
    '张三':[150,150,150,150],
    '李四':[0,0,0,0]
}
df = DataFrame(data=dic,index=['语文','数学','英语','理综'])
df

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  张三 李四
语文 150 0
数学 150 0
英语 150 0
理综 150 0

</div>

 

  • DataFrame索引操作

    • 对行进行索引

    • 队列进行索引

    • 对元素进行索引

df['张三'] #取列
df[['李四','张三']] #取多列
# df[0] #error,如果df有显示索引,那么在索引取值的话,只能用显示索引不能用隐式索引

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  李四 张三
语文 0 150
数学 0 150
英语 0 150
理综 0 150

</div>

 

  • iloc:

    • 通过隐式索引取行

  • loc:

    • 通过显示索引取行

#取单行
df.iloc[0]
df.loc['语文']
#取多行
df.iloc[[0,2]]

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  张三 李四
语文 150 0
英语 150 0

</div>

 

df.loc['英语','李四'] #取单个值
df.loc[['英语','数学'],'张三'] #取多个值

 

英语    150
数学    150
Name: 张三, dtype: int64

 

  • DataFrame的切片操作

    • 对行进行切片

    • 对列进行切片

df[0:2] #切行

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  张三 李四
语文 150 0
数学 150 0

</div>

 

df.iloc[:,0:1] #切列

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  张三
语文 150
数学 150
英语 150
理综 150

</div>

 

  • df索引和切片操作

    • 索引:

      • df[col]:取列

      • df.loc[index]:取行

      • df.iloc[index,col]:取元素

    • 切片:

      • df[index1:index3]:切行

      • df.iloc[:,col1:col3]:切列

  • DataFrame的运算

    • 同Series

============================================

练习:

  1. 假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。

  2. 假设张三期中考试数学被发现作弊,要记为0分,如何实现?

  3. 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?

  4. 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?

============================================

qimo = df
qizhong = df
(qizhong + qimo) / 2 #计算均值

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  张三 李四
语文 150 0
数学 150 0
英语 150 0
理综 150 0

</div>

 

qizhong.iloc[1,0] = 0
qizhong

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  张三 李四
语文 150 0
数学 0 0
英语 150 0
理综 150 0

</div>

 

qizhong['李四'] += 100
qizhong

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  张三 李四
语文 150 100
数学 0 100
英语 150 100
理综 150 100

</div>

 

qizhong += 10
qizhong

 

​​

.dataframe tbody tr th {
    vertical-align: top;
}
​
.dataframe thead th {
    text-align: right;
}

</style>

  张三 李四
语文 160 110
数学 10 110
英语 160 110
理综 160 110

</div>

 

  • 时间数据类型的转换

    • pd.to_datetime(col)

  • 将某一列设置为行索引

    • df.set_index()

延伸阅读
    < /body> < /html>