登录
  • #数据科学

pa‌‌‌‌‌‌‍‍‌‍‍‌‌‍‌‍‌‍‌‍‌‍‍‌‌‍‍‌‌‍‌‌ndas做data wrangling实用代码,不定期更新

PatrickPro2
2395
2
刚才看到一篇关于SQL知识点个人总结,虽然感觉没看太懂乱乱的,不过共享知识的想法是好的,所以我也来贡献些关于用pandas做data wrangling的常用代码吧。楼主目前是上海某数据公司做数据分析,虽然抬头是数据分析师,但data engineering, modelling, ab testing, R Shiny viz全都一一承包了(哭),真的心想着赶快出国赶快出国Orz。这些代码是我去年本科毕业到前阵子的工作中边学边做用到的,我有空会时不时更新把,现在更新是因为GRE单词背得太累了,换个事做做(哭)

其中data wrangling指的是data cleaning+data transformation。data cleaning是大家都知道的数据清洗,data transformation指的是把清洗好的数据转化成输出要用到的格式,比如图表的输出、模型的输入。

假设pandas简写为pd,表为dt

1. 基本

dt.info()

输出每列的:类型、多少NULL值、总共多少行,占的存储空间大小

dt.head()

输出表的前5行

pd.set_option("display.max_rows", 200)

配置输出行数改为最多200行。不过用默认的,最多只有100行,中间行会以省略号形式表示,看起来不方

dt['col1'].nunique()

查看col1列一共有多少个不同的值

dt.drop(['col1', 'col2'], axis = 1, inplace = True)

将col1列、col2列删除。这行命令大多用在数据清洗完后,对某些列不需要了,想一起删除掉

dt.loc[(dt['col1']==1)&(dt['col2'].isin([1,2,3]))]

根据具体要求查询语句,这句的意思是选择col1列所在的行等于1且col2列所在的行含1,2,3中任意一个

2. 时间

dt['col1'] = pd.to_datetime(dt['col1'], format='%Y-%m-%d %H:%M:%S')

col1列一开始如果不是datetime64类型,而是object类型(object类型在pandas可以直接理解为字符串类型),就需要用该语句转成datetime类型

dt['col1'].dt.year

dt['col1'].dt.month

dt['col1'].dt.week

dt['col1'].dt.weekday

如果col1列已经转成列datetime64类型,就可以用以上这些命令输出某时间对应的年、月、周、学期。其中周指的是一年的第1-第52周

pd.date_range(...)

这个方法极其强大,输出是含1列的表,这1列是符合某个要求日期序列。比如从2016年开始到2018年的每个星期二,就可以写为pd.date_range(start = '2016-01-01', end = '2016-12-31', freq = 'W-TUE')。这个的应用场景是当客户给的订单数据日期是不连续的,中间可能少几天,可视化出来的表就会看起来没什么变化,但少几天这可是非常重要的信息,这时候立马要去问客户少几天是啥情况。具体参数google pandas date_range到pandas官网看吧

dt['col1'].apply(lambda x: x[​:2])

这句的意思当col1列是object类型时,把col1列中每一行值取前2个字符并输出。另外apply是pandas中非常灵活且常用的方法,对标的是python中的map方法。apply用的最多的2个地方,一个是针对每一个列做处理,还有一个是对groupby做处理。另外上面这行命令还可以像下面这样表示,当处理非常麻烦且重要的列时,我通常用下面这种额外写个函数的方法来解决

def func(x):

return x[​:2]

dt['col1'].apply(func)

3. Groupby

dt.groupby(['col1']).agg({'col2': ['mean', 'nunique'], 'col3': ['min', 'max']})

这句的意思是按col1列分组,输出满足每行对应每个col1的值在col2列的平均值、col2列不同值的数量以及col3列的最小值、col3列的最大值。这样做没啥问题,但把输出assign(assign的中文是叫赋值吗,我就用英文了哈)给dt_result变量。当我想看dt_result中关于col2列mean的情况时,我得这样写:dt_result['col2']['mean']。这意思就是当用'col2': ['mean', 'nunique']这种形式想要得到关于col2的2个信息时,输出会自动变成2个levels,不方便,怎么办呢,下面一条命令就是解决方法

dt_result.columns = ['_'.join(x) for x in dt_result.columns.ravel()]

承接上条,意思是说把2 levels的列名转变为1 level,此时列名会变成col2mean, col2nunique, col3min, col3max

dt.groupby(['col1']).agg({'col2': unique})

col2列的每行都是一个列表,每行列表中的信息是不同col1列对应值的col2的所有不同的值

def func(x):

x.sort_values(by='col2', ascending = False)['col3'][​:2]

dt.groupby(['col1']).apply(func)

这句的意思是按col1列分组,对于不同col1列不同值下的剩余列,按照col2列的数据大小降序,并选择col2列降序后数据中col3列的前2行

4. 其他

pd.cut(dt['col1'],bins=365, right=False, labels=list(range(365)))

假设col1列是连续值, cut是专门用来分箱的,bins等于365指均等分365份,那么每份的大小等于(max-min)/365。right=False指[xx,xx)左闭右开,list这样写是因为我想输出的1-365这365个数据,而不是每行都是一个个左闭右开的范围。这行代码的结果是专门用来画柱状图来取代是分布图,因为分布图当数据skew非常厉害时,画出来的图很难看[br]
就先列这些吧,都是非常基础的。涉及到模型的话,还需要配合numpy做矩阵变换,这个有空再开个贴。另外pandas用得最复杂的地方以我的经验看来不是模型输入的数据处理,而是像留存矩阵、专题topic的采样分析等和数据分析有关的领域。

总之先积累些人品,希望年底申请能申到个好学校~

后话:因为最近要做个某模型的看板,我部门2个小哥哥和小姐姐强烈推荐用r shin做看板,所以我选择用r shiny做前端,r写数据逻辑,python当后端清洗客户数据和模型计算。然后我突然发现原来r更加适合做除建模以外所有和数据分析有关的活(当比sql强大多了)。其中,r的包实在太强大了,做data wrangling的话用dplyr或data.table比python的pandas强大很多很多,写的代码比我上面po出的要少;而r的可视化包也比python的方便,比如著名的ggplot2,以及专门用于shiny中输出交互可视化图的包leaflet和highcharter
2条回复
热度排序

发表回复