准备
其实呢,pandas是再numpy的基础上封装了一些功能,所以您看这篇文章的时候会觉得,好像pandas和Numpy用法有类似的地方。您需要有pandas和numpy, 如果没有,需要您
pip install numpypip install pandas
如果下载速度太慢,请看我另一篇博客: pip镜像管理和npm镜像管理
然后每次使用numpy都需要import 一下,以下默认都有
import numpy as npimport pandas as pd
. pandas.Series
创建
创建一个Series,可以如下:
pd.Series(range(15))
也可以指定索引
pd.Series(range(0, 4), index=list('ABCD'))
通过字典创建:
pd.Series({"a": 1, "b": 2, "c": 3}, index={'c', 'd', 'a', 'b'})
也可以通过标量创建
pd.Series(2020)
修改值
更改Series的元素只需要用下标修改即可,看个例子:
import numpy as npimport pandas as pds = pd.Series(np.arange(3), index=['a', 'b', 'c'])s['a'] = 100print(s)
好了,Series就介绍到这里了。
2. pandas.DataFrame
创建
传入一个数组来创建:
n = np.random.randint(low=0, high=10, size=(5, 5))df1 = pd.DataFrame(data=n)
我们给它定义一下索引
df2 = pd.DataFrame(data=n, columns=list('ABCDE'))
这时候输出发现好看多了。
我们再来看一个用字典生成的案例。
data = {'province': ['广东', '山东', '河南', '四川', '江苏', '河北', '湖南', '安徽', '湖北', '浙江'], 'population': [10999, 9946, 9532, 8262, 7998, 7470, 6822, 6195, 5885, 5590], 'city': ['广州', '济南', '郑州', '成都', '南京', '石家庄', '长沙', '合肥', '武汉', '杭州']}df = pd.DataFrame(data, columns=['province', 'population', 'city'])
还有呢,可以通过Series来创建:
s8 = pd.Series(np.arange(5), index=list('abcde'))s9 = pd.Series(range(5, 10), index=list('abcde'))s10 = pd.Series([10, 11, 12, 13, 14], index=list('abcdf'))df3 = pd.DataFrame([s8, s9, s10])
3. 数据清洗
我们以一个例子边处理边给大家讲解pandas的用法。在讲例子之前会给大家讲要注意的知识点。案例与案例之间是连续的。
知识点1. 读取xlsx文件
df = pd.read_excel('files/order2019.xlsx', index_col='id')
这里选取的order2019.xlsx文件给大家看一眼,看文件名应该知道,是2019年的订单数据,这里index_col指定用来做索引的是 id 那一列。这里哪个xlsx文件我放在和.py文件同个目录下的files目录下了。
例子1. 读取xlsx文件
我们来看有多少行:
import pandas as pdimport datetimeimport time# 读取数据文件start_time = time.time()df = pd.read_excel('files/order2019.xlsx', index_col='id')end_time = time.time()print(df) # 104557行print('读取 {} 行数据花了 {:.2f} 秒'.format(len(df), end_time - start_time))
运行结果:
知识点2. datatime
这里关于datetime有个小案例:
from datetime import datetimenow = datetime.now()print(now)print(now.year)print(now.month)print(now.day)print(type(now))
可见,datetime是一个可以帮助我们处理时间的类。
案例2 将 dataFrame中某一列的数据类型改为datetime类型
这里有两列需要处理一下
在这里插入图片描述可见,datetime是一个可以帮助我们处理时间的类。案例2 将 dataFrame中某一列的数据类型改为datetime类型这里有两列需要处理一下startTime = datetime.datetime(2019, 1, 1)endTime = datetime.datetime(2019, 12, 31, 23, 59, 59)# 将数据源中的时间数据转换成datetime形式df.orderTime = pd.to_datetime(df.orderTime)df.payTime = pd.to_datetime(df.payTime)print(df[df.orderTime < startTime])startTime = datetime.datetime(2019, 1, 1)endTime = datetime.datetime(2019, 12, 31, 23, 59, 59)# 将数据源中的时间数据转换成datetime形式df.orderTime = pd.to_datetime(df.orderTime)df.payTime = pd.to_datetime(df.payTime)print(df[df.orderTime < startTime])
运行结果:
这里我们运行结果输出订单日期早于2019年1月1日的订单信息。
知识点3. dataFrame删除记录
df.drop(index=df[逻辑运算].index, 【inplace=True】)
其中inplace可选可不选,默认为False,就是返回一个删除后的dataFrame,而原来的dataFrame 即现在这个例子的df是不变的。如果加上inplace=True,那么就是对df进行删除记录操作了,代码执行后,df 将被删除相应下标的行,返回None(不返回东西)。
案例3. 我们将早于2019年1月1号的都删除
# 将2019年1月1日前数据删除df.drop(index=df[df.orderTime < startTime].index, inplace=True)print(df) # 104552行print(' df '.center(50, '*'))# 显示晚于2019年12月31日23时59分59秒的订单print(df[df.orderTime > endTime])
好像没有2019年12月31日23时59分59秒的订单,如果有的话,我们也可以像这样去删除:
# 将2019年12月31日后数据删除df.drop(index=df[df.orderTime > endTime].index, inplace=True)
关于这个drop函数呢,相近的有一个函数dropna。
# 如果该行有none值,则删除该行d.dropna(axis=0, how='any')
知识点4. dataFrame.fillna()
上个知识点我们学习了如何删除掉含有none的行,但是有时候我们可能并不要删除某一行,我们只需要填充空缺的数据,比如用最小值或者众数。这里给大家举个例子,比如期末考试,小东因身体不舒服,缺考了体育,那么我们总不能因为小东体育缺考,我们就把他的行删掉吧。我们按理应该是把他体育的成绩置为0。当然这里我也只是举个例子,实际情况老师应该会直接写上0而不是写上缺考。
df['列名'].fillna(value=想替换none后的数据的值, inplace=True)
案例4 将chanelID为none的那一列用众数去替换
print(df[df.chanelID.isnull()])print('分割线'.center(50, '*'))# 对空值进行修补df['chanelID'].fillna(value=df.chanelID.mode()[0], inplace=True)print(df.info()) # 103146
首先,我们知道有8行数据为空,然后当我们替换后,发现chanelID和其他列的非空记录数一样,证明none值被我们替换了。
知识点5 新加一列
df['想要新增的列名'] = 和df一样记录长度的向量
案例5. 新增折扣列discount
# 折扣 = 实际付费 / 订单上的价格df['discount'] = (df.payment / df.orderAmount)print(df.describe())
运行结果:
最后,我想用一幅图来示例去除换行和空格的操作,也是挺常用的。
结语
其实关于pandas还有很多用法,特别强大,大家可以多去pandas官方文档转转或者去其他博客看看。
到这里你学会了吗?更多案例视频教程后台私信 小编 源码 获取