Pandas是Python的一个大数据处理模块。Pandas使用一个二维的数据结构DataFrame来表示表格式的数据,相比较于Numpy,Pandas可以存储混合的数据结构,同时使用NaN来表示缺失的数据,而不用像Numpy一样要手工处理缺失的数据,并且Pandas使用轴标签来表示行和列。

pandas与numpy在数据处理前期阶段起着重要作用,两者相辅相成,异曲同工

1.Series一维数据

Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成
Series的字符串表现形式为:索引在左边,值在右边。如果没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。可以通过Series的values和index属性获取其数组表现形式和索引对象:

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

a = pd.Series([1,2,3])
""" a:左边为索引,右边为值
0 1
1 2
2 3
"""

1.1 传递带有日期时间索引和标签

dates = pd.date_range('20190110',periods=6):period表示时间期间

1
2
3
4
>>> dates
DatetimeIndex(['2020-01-10', '2020-01-11', '2020-01-12', '2020-01-13',
'2020-01-14', '2020-01-15'],
dtype='datetime64[ns]', freq='D')

1.2 pandas的index指定索引目录

1
2
3
4
5
6
7
8
9
a1 = pd.Series([2, 3, 4, 5], index=['a', 'b', 'c', 'd'])
"""
>>> a1
a 2
b 3
c 4
d 5
dtype: int64
"""

2.Series支持numpy的array特性

  • 从ndarray创建Series

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import pandas as pd
    import numpy as np
    # np.array创建一维数组
    a2 = pd.Series(np.array([1,2,3,4]))
    # np.arrange(start,end,jiange)创建一维数组
    a3 = pd.Series(np.arange(1,9,2))
    """a2:
    0 1
    1 2
    2 3
    3 4
    dtype: int32
    """
  • 与标量的运算
    两个series运算,即索引值相对应的值相加减:
    a2 + a3

  • Series的索引:下角标从零开始(类似于数组的索引切片)
    b[0] :单个字符的索引
    b[[1,2,3]] :数组组合的索引所对应的具体值

  • 切片操作(满足左闭右开,起始索引为0的原则)
    b[1:4]

  • 通用函数(最大值,绝对值等)

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

    data = 10
    c1 = pd.Series(np.linspace(-1,1,data))
    print(c1)
    print(c1.min())
    print(c1.max())

    3.从字典创建series

3.1 从字典创建series

1
2
3
4
5
6
7
8
9
10
sr = pd.Series({'name': 'chd', 'age': 18, 'gender': 'man', 'capacity': 10,'is_love_girl':True})
"""
>>> sr
name chd
age 18
gender man
capacity 10
is_love_girl True
dtype: object
"""

3.2.in运算:

'a' in sr:只能判断键名是否在’pandas.core.series.Series’类中,不能判断values值

1
2
3
print('name' in sr)  # true
print('age' in sr) # true
print('love is unlimited' in sr) # false

3.3.遍历运算:只遍历打印值,不会打印键名

1
2
3
>>> x = [i for i in sr]
>>> x
['chd', 18, 'man', 10, True]

3.4.获取索引以及对应值

1
2
print(sr.index) # 获取索引
print(sr.values) # 获取对应的值

3.5 整数索引问题:

1
2
str = pd.Series(np.arange(4.))
print(str)

3.6 浅拷贝,a,b都指向内存地址,若其中一个修改值,则另一个也必会修改值

1
2
str2 = str[1:].copy()
print(str2)

series数据对齐,pandas在进行两个Series对象运算时,会按索引自动对齐然后运算
若两series对象的index长度不一样,则会当做数据缺失值NaN处理

4.Series对象运算

1
2
3
sr1 = pd.Series([12, 23, 34, 34], index=['c', 'a', 'b', 'd'])
sr2 = pd.Series([11, 20, 10], index=['a', 'b', 'c'])
print(sr1 + sr2)

4.1 Series灵活算术方法

1
2
3
print(sr1.add(sr2,fill_value = 0))
print(sr1.sub(sr2,fill_value = 0))
print(sr1.div(sr2,fill_value = 0))

4.2 缺失值处理方式:

缺失值处理方式一:过滤缺失数据str.dropna():直接删除缺值的键值

1
2
3
d = pd.Series(np.array([1, 3, 4., None, 8, None, 99]))
print(d.dropna())
print(d.isnull()) # 判断每一键值对是否缺失数据

缺失值处理方式二:填充缺失数据:str.fillna(填充值)

print(d.fillna(1))

缺失值处理方式三:不处理

提出NaN后求得平均值

print(d.mean())

5.DataFrame二维数组对象

DataFrame是一个表格式的数据结构,含有一组有序的列(即:好几列)。DataFrame可以被看做是由Series组成的字典,并且共用一个索引。

5.1 创建方式1:通过一个字典来创建

1
2
3
4
5
6
7
8
9
a = pd.DataFrame({'name': ['chd', 'zyq', 'fqt'], 'age': [18, 12, 15]})
print(a)
"""
>>>a 结果为
name age
0 chd 18
1 zyq 12
2 fqt 15
"""

5.2 index指定行索引

1
2
3
4
5
>>>pd.DataFrame({'name': ['chd', 'zyq', 'fqt'], 'age': [18, 12, 15]},index=['a','b','c'])
name age
a chd 18
b zyq 12
c fqt 15

5.3 创建方式二:用Series来组成字典

1
2
3
4
5
6
>>>pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([5,6,7,8],index=['a','b','c','d'])})
one two
a 1.0 5
b 2.0 6
c 3.0 7
d NaN 8

5.4 其它

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
28
29
30
31
32
33
34
35
36
37
38
# CSV文件的读写
# CSV文件的写入
print(a2.to_csv('spider案例.csv'))

# CSV文件的读取
print(pd.read_csv('spider案例.csv'))

# json数据的读取和存储
df = pd.read_json('demo2.json')
# 读取时可能乱序,需要对索引进行重新排序
df = df.sort_index()
print(df)

# 存储为json数据
df.to_json('out.json')

# Excel数据的读取
df_excel = pd.read_excel('inputs.xlsx')
# Excel的存储:需要用到openpyxl库
# sheet_name:设置工作表名,indexA=None不存储行索引
df_excel.to_excel('biao_name.xlsx',sheet_name='biao_name',index = None)


# DataFrame常用属性
# var.index获取行索引
print(a2.index)

# var.columns:获取列索引
print(a2.columns)

# values 获取取值数组(一般是二维数组)
print(a2.values)

# T:装置
print(a2.T)

# descriibe():获取统计数据
print(a2.describe())

6.pandas操作excel文件

pandas库操作excel其实是依赖其他的一些库,所以我们需要安装多个库

pip install xlrd
pip install openpyxl
pip install numpy
pip install pandas

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#pandas读取Excel的第一种方法
#方法一:默认读取第一个表单
print("\n方法一:")
xls_data=pd.read_excel('ceshi.xlsx',index_col='序列') #index_col 分行编号
# #这个会直接默认读取到这个Excel的第一个表单
print(xls_data.head()) #默认读取前5行的数据
# print("输出:\n{0}".format(xls_data.head()))#格式化输出

#方法二:通过指定表单名的方式来读取
print("\n方法二:")
df=pd.read_excel('ceshi.xlsx',sheet_name='Sheet2')
data=df.head() #默认读取前5行的数据
print("获取到所有的值:\n{0}".format(data))#格式化输出

#方法三:通过表单索引来指定要访问的表单,0表示第一个表单
#也可以采用表单名和索引的双重方式来定位表单
#也可以同时定位多个表单,方式都罗列如下所示
print("\n方法三:")
# df=pd.read_excel('ceshi.xlsx',sheet_name=['Sheet1','Sheet2'])
#可以通过表单名同时指定多个--不推荐使用,效果不好
# df=pd.read_excel('ceshi.xlsx',sheet_name=['Sheet2',0])
#可以混合的方式来指定--不推荐使用,效果不好

# df=pd.read_excel('ceshi.xlsx',sheet_name=1)
#可以通过表单索引来指定读取的表单--列表形式

# df=pd.read_excel('ceshi.xlsx',sheet_name=[0,1])
#可以通过索引 同时指定多个--不推荐使用,效果不好

data=df.values #获取所有的数据,注意这里不能用head()方法哦~
print("获取到所有的值:\n{0}".format(data))#格式化输出
# 以上读取的数据是一个二维矩阵,不利于处理自动化测试,

# pandas操作Excel的行列
print("\npandas操作Excel的行列")
# 1:读取指定的单行,数据会存在列表里面
df=pd.read_excel('ceshi.xlsx')
data1=df.loc[0].values #0表示第一行 这里读取数据并不包含表头,要注意哦!
print("读取指定的单行数据:\n{0}".format(data1))

print("\n2:读取指定的多行,数据会存在嵌套的列表里面:")
# 2:读取指定的多行,数据会存在嵌套的列表里面:
df=pd.read_excel('ceshi.xlsx')
data2=df.loc[[1,2]].values
print("读取指定的多行数据:\n{0}".format(data2))

print("\n3:读取指定的行列")
# 3:读取指定的行列:
df=pd.read_excel('ceshi.xlsx')
data3=df.iloc[1,2]
print("读取指定行列的数据:\n{0}".format(data3)) #dandelion-alipaymobile

# 4:读取指定的多行多列值:
print("\n4:读取指定的多行多列值:")
df=pd.read_excel('ceshi.xlsx',sheet_name='Sheet2')
data4=df.loc[[1,2],['姓名','年龄','性别']]
print("读取多行多列的数据:\n{0}".format(data4))
# 姓名 年龄 性别
# 1 sun 18 女
# 2 zhao 19 男

# 5:获取所有行的指定列
print("\n5:获取所有行的指定列")
df=pd.read_excel('ceshi.xlsx',sheet_name='Sheet2')
data5=df.loc[:,['姓名','年龄','性别']].values #得到的是嵌套列表
data6=df.loc[:,['姓名','年龄','性别']] #得到二维矩阵

print("获取所有行的指定列的数据:\n{0}".format(data5)) #得到的是嵌套列表
print("获取所有行的指定列的数据:\n{0}".format(data6)) #得到二维矩阵

# 6:获取行号并打印输出
print("\n6:获取行号并打印输出")
df=pd.read_excel('ceshi.xlsx',sheet_name='Sheet2')
print("输出行号列表:",df.index.values)
# 输出行号列表: [0 1 2 3 4 5 6]

# 7:获取列名并打印输出
print("\n7:获取列名并打印输出")
df=pd.read_excel('ceshi.xlsx',sheet_name='Sheet2')
print("输出标题:",df.columns.values)

# 输出标题: ['姓名' '年龄' '性别' '出生日期']

# 8:随机获取几行数的值:
print("\n8:获取指定行数的值:")
df=pd.read_excel('ceshi.xlsx',sheet_name='Sheet2')
print("输出值:\n",df.sample(3).values) #随机抽取3行查看,这个方法类似于head()方法以及df.values方法

# [['liu' 23 '女' '1995-05']
# ['wang' 17 '男' '1992-11']
# ['li' 20 '男' '1992-09']]

# 9:获取指定列的值:
print("\n9:获取指定列的值:")
df=pd.read_excel('ceshi.xlsx',sheet_name='Sheet2')
print("输出值:\n",df['姓名'].values)

# pandas处理Excel数据成为字典
print("\npandas处理Excel数据成为字典")
df=pd.read_excel('ceshi.xlsx',sheet_name="Sheet2")
test_data=[]
for i in df.index.values: #获取行号的索引,并对其进行遍历:
# 根据i来获取每一行指定的数据 并利用to_dict转成字典
row_data=df.loc[i,['姓名','年龄','性别','出生日期']].to_dict()
test_data.append(row_data)
print(test_data)
"""
[
{'姓名': 'wang', '年龄': 17, '性别': '男', '出生日期': '1992-11'},
{'姓名': 'sun', '年龄': 18, '性别': '女', '出生日期': '1992-12'},
{'姓名': 'zhao', '年龄': 19, '性别': '男', '出生日期': '1993-01'},
{'姓名': 'zhang', '年龄': 22, '性别': '女', '出生日期': '1994-05'},
{'姓名': 'zhou', '年龄': 16, '性别': '女', '出生日期': '1992-07'},
{'姓名': 'liu', '年龄': 23, '性别': '女', '出生日期': '1995-05'},
{'姓名': 'li', '年龄': 20, '性别': '男', '出生日期': '1992-09'}
]

"""

这里有点坑的是pandas操作excel没有追加模式,只能先读取数据后使用append追加再写入excel!

参考文章


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议