大家好,我是Cherish
使用 Pandas 已经快两年了,今天准备分享一篇关于数据处理的肝货!『偷懒小技巧 (* ̄︶ ̄)』
pandas 是专门做数据处理的工具(它属于python里的一个工具包),里面提供了大量便捷的数据处理函数和方法,可以简单粗暴理解为和 Excel 实现的功能类似,只是实现方式不同。
『啥时候用pandas ,啥时候用excel?』
1、数据量大用pandas, 数据量小用excel
2、哪一个能快速解决问题,就用哪个
3、excel解决不了的用pandas,再者用python自定义函数
1、cut 方法:用来把一组数据分割成离散的区间
需求:新增一列根据 salary 将数据分为三组
结果:
实现方式:
bins = [0,5000, 20000, 50000]
group_names = ['低', '中', '高']
df['categories'] = pd.cut(df['salary'], bins, labels=group_names)
df
2、agg 方法:用来快速聚合计算,在特定列上应用一或多个函数(通常结合gruopby使用)
需求:①统计各部门员工最低和最高薪资以及年龄 ②分别统计薪资的平均数,最大值,年龄的中位数,最小值
结果:
实现方式:
import pandas as pd
dic = {'department':['人事部','人事部','财务部','技术部','财务部','技术部'],
'salary':[3500,7500,8000,20000,7000,25500],
'age':[23,28,30,26,35,38]}
df= pd.DataFrame(dic)
# 第一个需求实现代码:对所有字段使用统一的计算方式
df.groupby(df['department']).agg(['min','max'])
# 第二个需求实现代码,对不同字段使用不同的计算方式
df.groupby(df['department']).agg({'salary':['mean','max'],'age':['median','min']})
3、split方法和expand参数:用来把一列字符串字段分割为多列
需求:将地址拆分,生成市和区两列新数据
结果:
实现方式:
df = pd.DataFrame({'name':['cherish','linda','mark'],
'address':['北京-昌平区','上海-黄浦区','赤峰市-红山区']})
df1 = df.address.str.split('-', expand=True)
pd.concat([df['name'],df1],axis='columns')
4、transform方法:①快速修改全部数据②用来将统计出的数据与原始数据加工到一起,解决新旧数据的长度是不一样的问题
需求:①给表格全部数据加1 ②按照班级统计出学生的平均成绩,并创建新的一列
结果:
实现方式:
# 需求①
df = pd.DataFrame({'A': range(3), 'B': range(1, 4)})
print(df)
df.transform(lambda x : x+1)
# 需求②
dic = {'name':['cherish','lili','mary','mark'],
'id':[1,2,3,4],
'class':['01','01','02','02'],
'code':[80,90,76,65],
'date':['2017-10-01','2017-10-01','2017-11-03','2017-11-01']}
df = pd.DataFrame(dic)
print(df)
df1 = df.groupby('class')['code'].transform('mean')
pd.concat([df,df1],axis=1)
5、map方法:用来批量对一个DataFrame进行逐行、逐列和逐元素的操作
需求:将学生信息里的性别男改为1,性别女改为0
结果:
实现方式:
dic = {'name':['cherish','lili','mary','mark'],
'sex':['男','男','女','女']}
df = pd.DataFrame(dic)
#实现方式①
df1 = df['sex'].map({'男':1,'女':0})
pd.concat([df,df1],axis=1)
# 实现方式②
#②使用函数
def my_gender_map(x):
gender = 1 if x == "男" else 0
return gender
#注意这里传入的是函数名,不带括号
data["gender"] = data["gender"].map(my_gender_map)
说明:map方法都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值。
6、apply方法:它和map方法的原理和作用类似,区别在于apply能传入更为复杂的功能函数。
需求:将薪资转换成能计算的方式,并算出平均值
结果:
实现方式:
# 定义拆分的函数
def split_salary(salary,method):
# 获取'-'的索引位置 10k-20K
position = salary.upper().find('-')
if position != -1:
#salary值是15k-25k形式
low_salary = salary[0:position-1]
high_salary= salary[position+1:len(salary)-1]
else:
#salary值是15k以上形式
low_salary = salary[:salary.upper().find('K')]
high_salary= low_salary
# 根据参数用以判断返回的值
if method == 'low':
return low_salary
elif method == 'high':
return high_salary
elif method == 'avg':
return (int(low_salary) + int(high_salary))/2
data['low_salary']=data.salary.apply(split_salary,method='low')
data['high_salary']=data.salary.apply(split_salary,method='high')
data['avg_salary']=data.salary.apply(split_salary,method='avg')
data.head()
说明:apply方法的第一个参数可以是函数(自定义或内置),第二个参数是参数1函数的对应参数(可选),apply实质上有点类似excel用的下拉修改整列值的功能,将自定义或内置函数,作用于一列数据的每个元素,最终实现批量处理。
7、applymap方法:用于对DataFrame中的每个单元格执行指定函数的操作
需求:将表格中全部数据保留两位小数点
结果:
实现方式:
df = pd.DataFrame(
{
"A":np.random.randn(5),
"B":np.random.randn(5),
"C":np.random.randn(5),
"D":np.random.randn(5),
"E":np.random.randn(5),
}
)
print(df)
df.applymap(lambda x:"%.2f" % x)
8、 explode方法:用于将一行数据展开成多行。
需求:将包含多个编号的数据,展开成多行
结果:
实现方式:
id = ['a','b','c']
code = [4,6,[2,3,8]]
day = [1,1,1]
df1 = pd.DataFrame({'id':id, 'code':code, 'day':day})
df1.explode('code').reset_index(drop=True)
9、 concat方法:用于合并多张表的数据
需求:将两个表格上下合并(行)和左右合并(列)
结果:
实现方式:
# ①合并列
df1 = pd.DataFrame({'A': range(3), 'B': range(1, 4)})
df2 = pd.DataFrame({'C': range(3,6), 'D': range(5, 8)})
pd.concat([df1,df2],axis=1)
# ②合并行
df1 = pd.DataFrame({'A': range(3), 'B': range(1, 4)})
df2 = pd.DataFrame({'A': range(3,6), 'B': range(5, 8)})
pd.concat([df1,df2],axis=0)
10、 merge方法:类似于SQL中对两张表进行的join连接。
- how:指定连接方式。可以是inner, outer, left, right,默认为inner。
- on:指定连接使用的列(该列必须同时出现在两个DataFrame中,如果指定两个不同列名,可用left_on/right_on),默认使用两个DataFrame中的所有同名列进行连接。
- left_index / right_index:是否将左边(右边)DataFrame中的索引作为连接列,默认为False。
- suffixes:当两个DataFrame列名相同时,指定每个列名的后缀(用来区分),默认为x与y。
需求:查询两张表,同一日期都消费过的数据
结果:
实现方式:
df1=pd.DataFrame({"date":[2015,2017,2018,2019],"x1":[2000,5000,8000,10000]})
df2=pd.DataFrame({'date':[2017,2018],"y1":[1000,2000]})
display(df1,df2)
df3=df1.merge(df2,on="date")
display(df3)
以上就是对pandas的10个小技巧分享,如果你熟练使用起来会发现这些不起眼的小方法是真的很强大。