【数据操作与可视化】Pandas数据处理-数值操作
将数据挑选出来之后,我们通常需要根据需求对数据进行进一步的操作,比如数值替换、排序、计数等等。
一、数值替换
# 1v1替换
df = pd.read_excel(r'数值操作.xlsx')
print(df.replace('张天峰', '张三丰')) # 非原地修改
# python中一对多替换
print(df.replace([1029, 1390, 2698], 999))
# python多对多替换
print(df.replace({305:499, 1029:999})) # 多点替换,点对点,不太灵活
# 通过函数操作多对多替换条件,传入apply中,比较灵活
def multi_replace(x):
if x > 1000:
x = 999
elif x < 500:
x = 499
return x
print(df['消费金额'].apply(lambda x: multi_replace(x)))
二、数值排序
# python中根据指定列进行排序
print(df.sort_values(by='消费金额', ascending=False))
# 在python中按多列数据进行排序操作
df.sort_values(by=['消费金额', '年龄'], ascending=[False, True])
# 按照索引值进行排序
print(df.sort_index(ascending=False))
三、删除记录
# 传入列名按列删除数据
print(df.drop(['消费金额', '年龄'], axis=1)) # 默认是按行删除,所以axis必须设置为1
print(df.drop(columns=['消费金额', '年龄'])) # 两种方式都可以,第二种方式不需要传axis=1,版本必须是pandas0.21以上
# 传入列的位置索引 删除对应列
print(df.drop(df.columns[[4,5]], axis=1)) # 指定删除特定列,删除列索引为4和5的列
print(df.drop(df.columns[1:4], axis=1)) # 切片语法删除多列
四、删除行
# 通过行标签按行删除
df = pd.read_excel(r'数值操作.xlsx')
print(df.drop([0,1,3])) # 注意,只有当行标签为默认的数字位置标签时才能传位置索引,否则必须传行标签
# 删除多行也可以用切片方式
print(df.drop(df.index[1:4]))
# 将默认索引改为自定义索引
df.index = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']
# df.drop([0,1,3]) # 报错
# 当行标签不是默认的0开头的位置标签时,必须传入标签值
print(df.drop(['one', 'five', 'nine']))
# 以切片索引形式删除多行,不受行标签是否是默认值0开始的限制
print(df.drop(df.index[1:4]))
五、插入新的行或列
在特定的位置插入行或者列也是比较常用的操作。具体的插入操作有两个关键要素,一个是在哪插入,另一个是插入什么。
pandas中没有专门插入新的一行的方法,要插入新行必须先拆分原来的dataframe,然后再做拼接操作。表的拼接后面会讲到,这里先讲插入新的列。
df = pd.read_excel(r'数值操作.xlsx')
# 在指定第3列处插入新列
df.insert(2, '新列', [i for i in range(10)]) # 直接对原来的df生效
# 默认是添加到末尾
df['再来一列'] = [1,2,3,4,5,6,7,8,9,10]
# 长度不够无法添加
df['再来一列'] = [1,2,3,4,5,6,7,8,9]
# 为数据添加分组列(即将某列数据划分为不同区间并打上标签)
# 划分数据区间
bins = [0, 1000, 1500, 3000]
# 为每个不同区间指定标签(注意,标签数必须比数据区间数少1个,否则报错)
labels = ['1000以下的屌丝用户', '1000-1500的普通用户', '1500以上的VIP客户']
df['用户等级'] = pd.cut(df['消费金额'], bins, labels=labels)
print(df)
六、apply及applymap函数
apply和applymap函数一般用于对dataframe中的数据执行批量操作。
# apply主要针对于某一列或某一行的元素执行相同的函数操作(相当于apply是作用于Series的)
df = pd.read_excel(r'数值操作.xlsx')
# 利用apply方法将消费金额全部加上元字,非原地修改
print(df['消费金额'].apply(lambda x : str(x) + '元'))
# 这里的lambda函数叫匿名函数,也就是没有名字的函数,一般用于以参数形式传递给另外一个函数来进行调用。这个匿名函数需要一个参数x,这个x值是apply函数自动传给它的。
# apply_map方法是针对dataframe中所有数据的,所以在使用时必须注意数据类型
print(df.applymap(lambda x: str(x) + 'ok'))
# 针对某一行执行函数,选中的是一个Series,要用apply
print(df.iloc[2].apply(lambda x: str(x)+'ok'))
# 针对多行执行函数,选中的其实是一个df,要使用applymap
print(df.iloc[5:9].applymap(lambda x : str(x) + 'ok'))
七、数据运算
在数据分析中,我们的各个分析指标都要靠数据运算方法运算出来,接下来我们来看看常用的数据运算方法。
# 数学运算
df = pd.read_excel(r'数据运算.xlsx')
# 加/减/乘/除都一样
print(df['Sale2015'] + df['Sale2016'])
# 比较运算
print(df['Sale2015'] > 3000) # 注意数据类型
# 汇总运算
df['Sale2015'].sum()
df['Sale2015'].count()
df['Sale2015'].mean()
df['Sale2015'].max()
df['Sale2015'].min()
df['Sale2015'].median() # 中位数
df['Sale2015'].mode() # 众数
df['Sale2015'].var() # 求方差
df['Sale2015'].std() # 标准差
df['Sale2015'].quantile(q=0.75) # 分位数
八、时间序列
时间序列是我们在数据分析中经常会遇到的一种数据集合,这种数据集合由时间类型的数据组成,所以我们应该熟练掌握在Pandas中如何处理时间日期类型的数据。
# 加载一个含有时间列的数据文件,将购买日期作为索引值, 注意要确保为时间日期类型
df = pd.read_excel(r'时间序列.xlsx', index_col=[3])
# 按时间序列的索引值进行排序
print(df.sort_index(ascending=True))
# 时间选择,(仅当时间列作为索引时可用)
print(df[df.index.year==2019]) # 筛选出2019年的购买记录
print(df[(df.index.year==2019) & (df.index.month==6)]) # 筛选出2019年6月的购买记录
print(df['2019-08-01':'2019-08-10']) # 选一个时间段内的数据
# 将时间索引变成普通时间列
df.reset_index(inplace=True)
# 普通日期列的时间比较
print(df[df['购买日期'] > pd.to_datetime("2019-8-1")])
# 比较一个范围内的日期值
print(df[(df['购买日期'] > pd.to_datetime("2019-8-1"))&(df['购买日期'] < pd.to_datetime("2019-8-11"))])
# 时间偏移,用pandas自带的date off库
from pandas.tseries.offsets import Day, Hour, Minute
date = pd.to_datetime("2023-08-09 12:23:34")
print(date + Day(1))
print(date + Hour(2))
print(date + Minute(3))
# 在dataframe中对日期列增加1天
df['购买日期'] = df['购买日期'] + Day(1)
print(df)
# 求某个日期值的年份、第几周及一周的第几日的信息
print(date.isocalendar()) # 显示总的信息
print(date.isocalendar()[0]) # 显示年份
print(date.isocalendar()[1]) # 显示第几周
print(date.isocalendar()[2]) # 显示在一周的第几天(周一是1,周天是7)
# 练习
# 将数值操作.xslx表中所有星期天的购买记录筛选出来
df = pd.read_excel('数值操作.xlsx')
# print(df)
print(df[df['购买日期'].apply(lambda x: x.isocalendar()[2]==7)])