准备
其实呢,pandas是再numpy的基础上封装了一些功能,所以您看这篇文章的时候会觉得,好像pandas和Numpy用法有类似的地方。
您需要有pandas和numpy, 如果没有,需要您
pip install numpy
pip install pandas
如果下载速度太慢,请看我另一篇博客: pip镜像管理和npm镜像管理
然后每次使用numpy都需要import 一下,以下默认都有
import numpy as np
import pandas as pd
1. 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 np
import pandas as pd
s = pd.Series(np.arange(3), index=['a', 'b', 'c'])
s['a'] = 100
print(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 pd
import datetime
import 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 datetime
now = datetime.now()
print(now)
print(now.year)
print(now.month)
print(now.day)
print(type(now))
可见,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])
运行结果:
这里我们运行结果输出订单日期早于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官方文档转转或者去其他博客看看。