我爱编程

5.数据分析工具Pandas

2018-01-25  本文已影响40人  零_WYF

1. 什么是Pandas?

Pandas的名称来自于面板数据(panel data)和Python数据分析(data analysis)。
Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。

2. Pandas的数据结构

2.1 Series

Series是一种类似于一维数组的对象,组成:
一组数据(各种NumPy数据类型)
一组与之对应的索引(数据标签)
索引(index)在左,数据(values)在右
索引是自动创建的

2.2 DataFrame

一个表格型的数据结构,它含有一组有序的列,每列可以是不同类型的值。DataFrame既有行索引也有列索引,数据是以二维结构存放的。
类似多维数组/表格数据 (如,excel, R中的data.frame)
每列数据可以是不同的类型
索引包括列索引和行索引

3. 范例

3.1 导入模块

import pandas as pd

3.2 通过list构建Series

ser_obj1 = pd.Series(range(10,31))
print(ser_obj1)
# 打印前三行
print(ser_obj1.head(3))
#############运行结果##################
0     10
1     11
2     12
3     13
4     14
5     15
6     16
7     17
8     18
9     19
10    20
11    21
12    22
13    23
14    24
15    25
16    26
17    27
18    28
19    29
20    30
dtype: int64
0    10
1    11
2    12
dtype: int64
#######################################

3.3 通过dict构建Series

dict = {"a":1,"b":2,"c":3}
ser_obj2 = pd.Series(dict)
print(ser_obj2)
#############运行结果##################
a    1
b    2
c    3
dtype: int64
#######################################

3.4 获取数据和索引

print(ser_obj2.values)
print(ser_obj2.index
#############运行结果##################
[1 2 3]
Index(['a', 'b', 'c'], dtype='object')
#######################################

3.5 通过索引获取数据

print(ser_obj2["b"])
print(ser_obj2[1])
#############运行结果##################
2
2
#######################################

3.6 设置名称

# 对象名
ser_obj2.name = 'zero'
# 对象索引名
ser_obj2.index.name = 'wyf'
print(ser_obj2.head())
#############运行结果##################
wyf
a    1
b    2
c    3
Name: zero, dtype: int64
#######################################

3.7 通过ndarray构建DataFrame

import numpy as np
arr_obj = np.random.rand(3,4)
df_obj = pd.DataFrame(arr_obj)
print(df_obj)
print(df_obj.head(2)) # 查看前两行
#############运行结果##################
          0         1         2         3
0  0.267074  0.744870  0.021856  0.758293
1  0.649231  0.119609  0.536336  0.503615
2  0.561522  0.247207  0.280449  0.594249
          0         1         2         3
0  0.267074  0.744870  0.021856  0.758293
1  0.649231  0.119609  0.536336  0.503615
#######################################

3.8 通过dict构建DataFrame

dict = {
    "A":1,
    "B":pd.Timestamp("20180124"),
    "C":pd.Series(range(10,14),dtype="float64"),
    "D":["python","java","c++","c"],
    "E":np.array([3]*4,dtype="int32"),
    "F":"zero",
}
df_obj = pd.DataFrame(dict)
print(df_obj)
#############运行结果##################
   A          B     C       D  E     F
0  1 2018-01-24  10.0  python  3  zero
1  1 2018-01-24  11.0    java  3  zero
2  1 2018-01-24  12.0     c++  3  zero
3  1 2018-01-24  13.0       c  3  zero
#######################################

3.9 通过列索引获取列数据

print(df_obj['A'])
print(type(df_obj['A']))
print(df_obj.A)
#############运行结果##################
0    1
1    1
2    1
3    1
Name: A, dtype: int64
<class 'pandas.core.series.Series'>
0    1
1    1
2    1
3    1
Name: A, dtype: int64
#######################################

3.10 dataframe数据访问

# 通过索引,先列后行
print(df_obj['D'][0])
# 查找指定元素,先找列,再找行
print(df_obj.D[2])
#############运行结果##################
python
c++
#######################################

3.11 增加列数据

df_obj["G"] = "零"
df_obj["H"] = df_obj["C"] + 10
df_obj["I"] = df_obj["C"] * 3
print(df_obj)
#############运行结果##################
   A          B     C       D  E     F  G     H     I
0  1 2018-01-24  10.0  python  3  zero  零  20.0  30.0
1  1 2018-01-24  11.0    java  3  zero  零  21.0  33.0
2  1 2018-01-24  12.0     c++  3  zero  零  22.0  36.0
3  1 2018-01-24  13.0       c  3  zero  零  23.0  39.0
#######################################

3.12 删除列

del df_obj["H"]
print(df_obj.head())
#############运行结果##################
   A          B     C       D  E     F  G     I
0  1 2018-01-24  10.0  python  3  zero  零  30.0
1  1 2018-01-24  11.0    java  3  zero  零  33.0
2  1 2018-01-24  12.0     c++  3  zero  零  36.0
3  1 2018-01-24  13.0       c  3  zero  零  39.0
#######################################

3.13 Series和DataFrame中的索引都是Index对象

print(type(ser_obj.index))
print(type(df_obj.index))
#############运行结果##################
<class 'pandas.core.indexes.range.RangeIndex'>
<class 'pandas.core.indexes.range.RangeIndex'>
#######################################

3.14 index 指定行索引名

# 不指定索引的话,默认从0开始
ser_obj3 = pd.Series(range(5),index = ['a','b','c','d','e'])
print(ser_obj3.head())
#############运行结果##################
a    0
b    1
c    2
d    3
e    4
dtype: int64
#######################################

3.15 行索引

print(ser_obj3['b'])
print(ser_obj3[2])  # 索引号从0开始
#############运行结果##################
1
2
#######################################

3.16 切片索引

print(ser_obj3[1:3])
print(ser_obj3['b':'d'])
#############运行结果##################
print(ser_obj3[1:3])
print(ser_obj3['b':'d'])
print(ser_obj3[1:3])
print(ser_obj3['b':'d'])
b    1
c    2
dtype: int64
b    1
c    2
d    3
dtype: int64
#######################################

3.17 不连续索引

print(ser_obj3[[0,2,4]])
print(ser_obj3[['a','c','e']])
#############运行结果##################
a    0
c    2
e    4
dtype: int64
a    0
c    2
e    4
dtype: int64
#######################################

3.18 布尔索引

ser_bool = ser_obj3 > 2 
print(ser_bool)
print(ser_obj3[ser_bool])
print(ser_obj3[ser_obj3 > 2])
#############运行结果##################
a    False
b    False
c    False
d     True
e     True
dtype: bool
d    3
e    4
dtype: int64
d    3
e    4
dtype: int64
#######################################

3.19 指定列索引名

df_obj = pd.DataFrame(np.random.randn(5,4),columns=['a','b','c','d'])
print(df_obj.head())
#############运行结果##################
          a         b         c         d
0  0.939462 -1.064223 -0.874885  1.180462
1 -1.288067 -0.064089  0.855795  0.666919
2 -0.339794  0.560721  0.550258 -0.576895
3 -0.704544  0.622264  0.764208  0.106985
4 -0.079751  0.930942  0.661030  1.267764
#######################################

3.20 列索引

print(df_obj['b'])
#############运行结果##################
0    0.906177
1    0.034646
2    0.497803
3    0.138119
4    0.244221
Name: b, dtype: float64
#######################################

3.21 不连续索引

print(df_obj[['a','c']])
#############运行结果##################
          a         c
0  0.057483 -0.429583
1  0.703981 -0.441183
2 -1.043533  0.850768
3  1.288697  0.242864
4  0.000106 -0.333193
#######################################

3.22 loc标签索引

print(ser_obj3['b':'d'])
print(ser_obj3.loc['b':'d'])
#############运行结果##################
b    1
c    2
d    3
dtype: int64
b    1
c    2
d    3
dtype: int64
#######################################

3.23 高级索引:标签、位置和混合

print(df_obj['a'])
#############运行结果##################
0    0.939462
1   -1.288067
2   -0.339794
3   -0.704544
4   -0.079751
Name: a, dtype: float64
#######################################

# 第一个参数是索引行,第二个参数是列
print(df_obj.loc[0:2,'a'])
print(df_obj.loc[1:3,['b','c']])
print(df_obj.loc[1:3,'b':'d'])
#############运行结果##################
0    0.939462
1   -1.288067
2   -0.339794
Name: a, dtype: float64
          b         c
1 -0.064089  0.855795
2  0.560721  0.550258
3  0.622264  0.764208
          b         c         d
1 -0.064089  0.855795  0.666919
2  0.560721  0.550258 -0.576895
3  0.622264  0.764208  0.106985
#######################################

3.24 iloc位置索引

作用和loc一样,不过是基于索引编号来索引
print(ser_obj3[1:3])
print(ser_obj3.iloc[1:3])
print(df_obj.iloc[0:2,0])
#############运行结果##################
b    1
c    2
dtype: int64
b    1
c    2
dtype: int64
0    0.939462
1   -1.288067
Name: a, dtype: float64
#######################################

3.25 ix标签与位置混合索引

# Series
print(ser_obj3.ix[1:3])
print(ser_obj3.ix['b':'c'])
#############运行结果##################
b    1
c    2
dtype: int64
b    1
c    2
dtype: int64
#######################################
# DataFrame
print(df_obj.loc[0:2,'a'])
print(df_obj.ix[0:2,0])
#############运行结果##################
0    0.939462
1   -1.288067
2   -0.339794
Name: a, dtype: float64
0    0.939462
1   -1.288067
2   -0.339794
Name: a, dtype: float64
#######################################

3.26 Series的对其运算

Series 按行、索引对其
ser_obj4 = pd.Series(range(10,20),index = range(10))
ser_obj5 = pd.Series(range(20,25),index = range(5))
print(ser_obj4 + ser_obj5)
#############运行结果##################
0    30.0
1    32.0
2    34.0
3    36.0
4    38.0
5     NaN
6     NaN
7     NaN
8     NaN
9     NaN
dtype: float64
#######################################
print(ser_obj4)
print(ser_obj5)
print(ser_obj4.add(ser_obj5))
# fill_value参数,将Series中未对齐的数据,填充为指定的值,一般指定为0,避免运算误差
print(ser_obj4.add(ser_obj5,fill_value=0))
#############运行结果##################
0    10
1    11
2    12
3    13
4    14
5    15
6    16
7    17
8    18
9    19
dtype: int64
0    20
1    21
2    22
3    23
4    24
dtype: int64
0    30.0
1    32.0
2    34.0
3    36.0
4    38.0
5     NaN
6     NaN
7     NaN
8     NaN
9     NaN
dtype: float64
0    30.0
1    32.0
2    34.0
3    36.0
4    38.0
5    15.0
6    16.0
7    17.0
8    18.0
9    19.0
dtype: float64
#######################################

3.27 DataFrame按行、索引对齐

df1 = pd.DataFrame(np.ones((2,2)),columns = ['a','b'])
df2 = pd.DataFrame(np.ones((3,3)),columns = ['a','b','c'])
print(df1.add(df2))
print(df1.add(df2,fill_value=0))
#############运行结果##################
     a    b   c
0  2.0  2.0 NaN
1  2.0  2.0 NaN
2  NaN  NaN NaN
     a    b    c
0  2.0  2.0  1.0
1  2.0  2.0  1.0
2  1.0  1.0  1.0
#######################################

3.28 可直接使用NumPy的函数

df3 = pd.DataFrame(np.random.randn(5,4)-1)
print(df3)
# 绝对值
print(np.abs(df3))
#############运行结果##################
          0         1         2         3
0 -0.229173 -2.923527 -2.111435 -2.289574
1 -1.357054 -0.859935 -2.618068 -0.990787
2 -0.618717 -0.277620 -1.687598 -0.201005
3 -1.805256 -0.584533 -0.803320 -1.920048
4 -0.703489  0.283588 -0.183795 -1.499259
          0         1         2         3
0  0.229173  2.923527  2.111435  2.289574
1  1.357054  0.859935  2.618068  0.990787
2  0.618717  0.277620  1.687598  0.201005
3  1.805256  0.584533  0.803320  1.920048
4  0.703489  0.283588  0.183795  1.499259
#######################################

3.29 通过apply将函数应用到列或行上

Axis参数可以指定轴向,默认值为0,方向是列,值为1:方向是行
f = lambda x:x.max()
print(df3.apply(f)) # 方向为列
print(df3.apply(f,axis=1)) # 方向为行
#############运行结果##################
0   -0.229173
1    0.283588
2   -0.183795
3   -0.201005
dtype: float64
0   -0.229173
1   -0.859935
2   -0.201005
3   -0.584533
4    0.283588
dtype: float64
#######################################

3.30 通过applymap将函数应用到每个数据上,只用于DataFrame

f1 = lambda x:'%.2f' % x
print(df3.applymap(f1))
f2 = lambda x:x+x
print(df3.applymap(f2))
#############运行结果##################
       0      1      2      3
0  -0.23  -2.92  -2.11  -2.29
1  -1.36  -0.86  -2.62  -0.99
2  -0.62  -0.28  -1.69  -0.20
3  -1.81  -0.58  -0.80  -1.92
4  -0.70   0.28  -0.18  -1.50
          0         1         2         3
0 -0.458346 -5.847054 -4.222869 -4.579149
1 -2.714108 -1.719869 -5.236136 -1.981574
2 -1.237435 -0.555239 -3.375196 -0.402010
3 -3.610512 -1.169066 -1.606641 -3.840096
4 -1.406977  0.567175 -0.367590 -2.998518
#######################################

3.31 排序

索引排序
# Series
ser_obj6 = pd.Series(range(10,15),index=np.random.randint(5,size=5))
print(ser_obj6)
#############运行结果##################
4    10
1    11
1    12
0    13
3    14
dtype: int64
#######################################
# 降序排序
print(ser_obj6.sort_index(ascending = False))
#############运行结果##################
4    10
3    14
1    11
1    12
0    13
dtype: int64
#######################################

3.32 对DataFrame操作时注意轴方向,默认列,axis=1为行

# DataFrame
df_obj2 = pd.DataFrame(np.random.randn(3,5),
                       index = np.random.randint(3,size=3),
                      columns = np.random.randint(5,size=5))
print(df_obj2)
df_obj2_isort = df_obj2.sort_index(axis=1,ascending=False)
print(df_obj2_isort)
#############运行结果##################
          0         1         2         3         0
1  0.557994  0.555874  1.899686 -1.334528  0.058536
0 -0.013865 -1.234426 -0.527396 -0.864309  0.599536
2  1.136960 -0.290542  0.452911  0.973588  1.445474
          3         2         1         0         0
1 -1.334528  1.899686  0.555874  0.557994  0.058536
0 -0.864309 -0.527396 -1.234426 -0.013865  0.599536
2  0.973588  0.452911 -0.290542  1.136960  1.445474
#######################################

3.33 按值排序-Series对象

# 创建随机Series对象
ser_obj7 = pd.Series(np.random.randint(10,20,size=10))
print(ser_obj7)
print(ser_obj7.sort_values()) # 默认升序
print(ser_obj7.sort_values(ascending = False)) # 降序 
#############运行结果##################
0    19
1    17
2    18
3    18
4    19
5    13
6    13
7    16
8    11
9    12
dtype: int32
8    11
9    12
5    13
6    13
7    16
1    17
2    18
3    18
0    19
4    19
dtype: int32
4    19
0    19
3    18
2    18
1    17
7    16
6    13
5    13
9    12
8    11
dtype: int32
#######################################

3.34 按值排序- DataFrame对象

# 如果根据某一个行名/列名来排序,要保证没有其他相同的行名/列名,axis指定排序的轴方向
df4 = pd.DataFrame(np.random.randn(3,5),
                  index = np.random.randint(3,size=3),
                  columns = np.random.randint(5,size=5))
print(df4.sort_values(by=2))
print(df4.sort_values(by=2,axis=1))
#############运行结果##################
          0         0         3         0         2
0  0.108904  2.141896  0.707657  1.146837 -0.016124
0  0.265732 -0.789782 -0.575320 -0.993737  0.470039
2 -0.080078  0.770228 -0.031199 -0.082614  1.062954
          0         0         3         0         2
0  1.146837  0.108904  0.707657  2.141896 -0.016124
0 -0.993737  0.265732 -0.575320 -0.789782  0.470039
2 -0.082614 -0.080078 -0.031199  0.770228  1.062954
#######################################

3.35 处理缺失数据

df_obj5 = pd.DataFrame([
    [1,2,np.nan,np.nan],
    [np.nan,3,4,np.nan],
    list(range(4))
])
print(df_obj5)
#############运行结果##################
     0  1    2    3
0  1.0  2  NaN  NaN
1  NaN  3  4.0  NaN
2  0.0  1  2.0  3.0
#######################################

3,36 判断是否存在缺失值:isnull()

# 判断是否nan值,如果是返回True,否则False
print(df_obj5.isnull())
#############运行结果###################
       0      1      2      3
0  False  False   True   True
1   True  False  False   True
2  False  False  False  False
#######################################

3.37 丢弃缺失数据:dropna()

# 根据axis轴方向,丢弃包含nan的行或者列
print(df_obj5.dropna())
print(df_obj5.dropna(axis=1))
#############运行结果##################
     0  1    2    3
2  0.0  1  2.0  3.0
   1
0  2
1  3
2  1
#######################################

3.38 填充缺失数据:fillna()

#将nan值替换为指定的值
print(df_obj5.fillna(0))
#############运行结果##################
     0  1    2    3
0  1.0  2  0.0  0.0
1  0.0  3  4.0  0.0
2  0.0  1  2.0  3.0
#######################################
上一篇下一篇

猜你喜欢

热点阅读