说起pandas,立马就会想到DataFrame,这个数据结构在操作一些如csv等文件时很方便,在处理xls文件时,我也习惯于将其转化为DataFrame来操作(如果有别的更方便的方法,也希望赐教啦~),在理解时,也可以将其理解为如excel中,由行、列组成的表格
DataFrame的创建
DataFrame可以通过如下方式创建:
pandas.DataFrame( data, index, columns, dtype, copy)
各参数的含义如下:
参数 | 含义 |
---|---|
data | 原始数据形式,如:ndarray,series,map,lists,dict,constant和另一个DataFrame |
index | 对应行标签的索引,若未给定,则默认从0开始编号 |
columns | 对应列标签的索引值,若未给定,默认从0开始编号 |
dtype | 列的数据类型 |
copy | 是否用于复制,一般默认为False |
data表示DataFrame支持的数据类型,以下面的代码示例,用列表创建:
>>> d1 = [['a', 1], ['b', 2], ['c', 11], ['d', 223]]
>>> df = pd.DataFrame(d1)
>>> df
0 1
0 a 1
1 b 2
2 c 11
3 d 223
更进一步的:
>>> df = pd.DataFrame(d1, index = [11, 111, 1111, 11111], columns = ['name', 'no'], dtype = float)
>>> df
name no
11 a 1.0
111 b 2.0
1111 c 11.0
11111 d 223.0
这里将行和列的索引进行指定,同时将’no’列的值设为float类型,最后的结果即如上所示
DataFrame的索引
在DataFrame中,索引主要有两种方法:loc
和iloc
怎么区分的?跟上面创建的时候一样,创建的时候index
对应行,columns
对应列
那么这里的iloc
比loc
多了个i,即index
,所以iloc
是根据行索引,而loc
是根据列索引
具体的用法可以在各自的工程中进行实践,仍旧以上面的实例为例:
>>> df.iloc[1:]
name no
111 b 2.0
1111 c 11.0
11111 d 223.0
>>> df.iloc[1:, 0]
111 b
1111 c
11111 d
>>> df.loc[(df['name']>'b')]
name no
1111 c 11.0
11111 d 223.0
上面展示了三种索引方法,第一种是最简单的iloc索引,DataFrame内部默认还是按照0、1、2的行编号,因此df.iloc[1:]
的意思就是从df中取得从1开始编号的所有行
而第二种,除了行以外,后面增加的数字0对应第0列,即name列
至于第三种,则是直接根据列值进行索引了,df['name']
会首先把df中的name列单独取出来,由于这是一个str值,因此最后比较的时候也需要加引号,从这些name中取出所有比’b’大的数,最后的结果即如上所示
除了这两个,一般还有at
、ix
等,后者的功能也很强大,相当于loc
和iloc
的结合,但平时有了前面提到的两个一般就够用了
最后再说两点:
DataFrame的排序:
>>> df.sort_values(by=['no'], ascending = False, inplace = True)
>>> df
name no
11111 d 223.0
1111 c 11.0
111 b 2.0
11 a 1.0
这个一看参数名就知道了,ascending
代表是否按升序排列,True为升序,False则为降序
打开xlsx,并转为DataFrame:
import openpyxl
import pandas as pd
import numpy as np
import os
def excel2DF:
excelFile = openpyxl.load_workbook(filename)
sheet = excelFile['工作表1']
i = 1
# fields代表第一行,级表头
fields = []
data = []
for row in sheet.rows:
tmpList = []
for cell in row:
aa = str(cell.value)
tmpList.append(aa)
if i == 1:
fields = tmpList
else:
data.append(tmpList)
i = i + 1
data = np.array(data)
# 获取所有行的三到七列
data = pd.DataFrame(data[:, 3:10],
columns=['a', 'b', 'c', 'd', 'e', 'f', 'g'])
return data
若有使用不当或可以改进的地方,还望指出,谢谢