pandas技巧(一) | 不起眼的小方法,却有大作用 !

大家好,我是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 ②按照班级统计出学生的平均成绩,并创建新的一列
结果:
image.png
实现方式:
# 需求①
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个小技巧分享,如果你熟练使用起来会发现这些不起眼的小方法是真的很强大。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容