--用勇气改变可以改变的事情,用胸怀接受不可改变的事情,用智慧分辨两者的不同,学习编程成就更好的自己--
Python语言简洁生动,特别适合文科生学习入门IT世界,用几十行代码就能够做一个完整的爬虫脚本,开发效率杠杠的!短时间内即可解决工作和学习中碰到的各种棘手问题。(本人外语专业毕业,机缘巧合爱上编程,自学道路曲曲折折,痛并快乐!)这里总结一下自学Python遇到的难点和重点,分享码过的代码和要点总结,希望能够给初学者一点启示和鼓励,同时愿意结交更多大神交流有助提升自己的水平。
在日常数据处理过程中经常需要按要求剔除重复数据,另外还经常需要按实际情况计算两个日期字段的时间间隔,今天就通过一个有趣和生动的案例来给大家简单介绍一下在pandas中数据去重和计算日期间隔功能,下面来看看以下数据集合:
可以看到该数据集合有些行数据是完全一样的,另外还包括了两个日期数据字段(上映日期和下映日期),接下来逐一举例讲解:
首先在Jupyter-Notebook环境下读取和查看数据整体情况:
根据电影名字删除重复值,但同时只保留首个出现的数据:
这里主要使用的是drop_duplicates(subset="字段名",keep="first")方法,subset设定以哪个字段为依据进行删除重复值,而keep则为保留方法,通过观察结果可知只剩下唯一的电影名数据。
根据电影名字删除重复值,但同时只保留最后一个出现的数据:
通过修改keep参数就得到了每组数据中最后一行出现的值,大家可以根据这点来提取想要的唯一数据了。
构造新字段即是电影名和语言组合字段,方便提取对应维度唯一数据:
了解和学会去重方法的基本操作,就可以随心所欲地进行去重了,这里先通过字段间组合拼接得到新字段,然后根据这个新字段来去重吧!!!
根据电影名字&语言删除重复值,但同时只保留首个出现的数据:
同样再举例说明一下去重功能,给大家加深印象和理解:
根据语言删除重复值,但同时只保留第一个出现的数据:
根据类型删除重复值,但同时只保留最后一个出现的数据:
讲到这里大家是不是基本上掌握了去重功能,接下来再看看日期计算的问题吧,要知道在Excel里两个日期字段是可以直接进行计算的,例如相减得到日期差(年月日等),那么在pandas里是不是也有类似的做法呢?
直接使用两个日期字段(上映日期和下映日期)进行相减运算如下:
了解一下对应的数据类型:
通过处理果然可以得到结果!!!通过观察数据类型方法可以看到并不是数值数据,那么如何能够得到纯数字的相关天数呢?因为在计算日期间隔时往往需要得到日期数值差进行对应判断分类和分析。
通过pd.Period方法计算相差天数得到数值数据:
那么是不是可以得到对应的月份和年份数值差呢?
通过pd.Period方法计算相差月份差得到数值数据:
通过pd.Period方法计算相差年份差得到数值数据
在这里有两个知识点组成,一个是要灵活使用自定义函数满足自己的需求,另外一个是熟悉和使用pd.Period语法参数,掌握了这些就基本上可以解决计算日期间隔的问题了。
整体代码汇总如下:
import pandas as pd
import datetime
import re
import os
#set the work path
def Set_Work_Path(x):
try:
os.chdir(x)
route = os.getcwd()
return route
except Exception:
print("No Result")
work_path = r"E:\DATA\20210927"
Set_Work_Path(work_path)
#loading data
data = pd.read_excel("DATA.xlsx",header=0,sheet_name="DATA",engine="openpyxl")
display(data.dtypes)
display(data)
#根据电影名字删除重复值,但同时只保留首个出现的数据
df1 = data.drop_duplicates(subset="电影名字",keep="first")
display(df1)
#根据电影名字删除重复值,但同时只保留最后一个出现的数据
df2 = data.drop_duplicates(subset="电影名字",keep="last")
display(df2)
#构造新字段即是电影名和语言组合字段,方便提取对应维度唯一数据
data["电影名字&语言"] = data["电影名字"] "-" data["语言"]
display(data)
#根据电影名字&语言删除重复值,但同时只保留首个出现的数据
df3 = data.drop_duplicates(subset="电影名字&语言",keep="first")
display(df3)
#根据语言删除重复值,但同时只保留第一个出现的数据
df4 = data.drop_duplicates(subset="语言",keep="first")
display(df4)
#根据类型删除重复值,但同时只保留最后一个出现的数据
df5 = data.drop_duplicates(subset="类型",keep="last")
display(df5)
#计算日期间隔-直接通过相减求天数差
data["相差天数"] = data["下映日期"] - data["上映日期"]
display(data)
display(data.dtypes)
#计算相差天数得到数值数据
#利用pd.Period方法构造自定义函数
def Get_Day_Diff(df,x,y):
try:
return (pd.Period(df[x],freq="D") - pd.Period(df[y],freq="D")).n
except Exception:
return ""
data["相差天数-数值"] = data.apply(Get_Day_Diff,axis=1,args=("下映日期","上映日期"))
display(data)
#计算相差月份并得到相差纯数值
#利用pd.Period方法构造自定义函数
def Get_Month_Diff(df,x,y):
try:
return (pd.Period(df[x],freq="M") - pd.Period(df[y],freq="M")).n
except Exception:
return ""
data["相差月份-数值"] = data.apply(Get_Month_Diff,axis=1,args=("下映日期","上映日期"))
display(data)
#计算相差年份并得到相差纯数值
#利用pd.Period方法构造自定义函数
def Get_Year_Diff(df,x,y):
try:
return (pd.Period(df[x],freq="Y") - pd.Period(df[y],freq="Y")).n
except Exception:
return ""
data["相差年份-数值"] = data.apply(Get_Year_Diff,axis=1,args=("下映日期","上映日期"))
display(data)
通过今天的案例,大家可以基本上掌握了如何去重并轻松搞定日期间隔计算问题了,学习数据处理最重要的就是在实际中多练多用,是不是有好多小伙伴也碰到类似的问题呢?那就赶紧动手试一下吧!!!
END
我为人人,人人为我!!欢迎大家关注,点赞和转发!!!
~~人生不是赛场,梦想不容退场~~不断努力学习蜕变出一个更好的自己,不断分享学习路上的收获和感悟帮助他人成就自己!!!
,