当前位置: 首页 > 科技观察

20篇短小精悍的熊猫秀操作

时间:2023-03-14 12:41:13 科技观察

最近收到了出版社的新书《深入浅出pandas》,内容很不错,目前正在各大商城上架。当然J哥给大家赢了3份,免费送出。参与方式见文末。1.ExcelWriter的dataframe中经常出现中文。如果直接输出到csv,中文会显示乱码。但Excel不同。ExcelWriter是pandas的一个类,可以让dataframe数据框直接输出到excel文件,可以指定工作表的名称。df1=pd.DataFrame([["AAA","BBB"]],列=["垃圾邮件","鸡蛋"])df2=pd.DataFrame([["ABC","XYZ"]],列=["Foo","Bar"])withExcelWriter("path_to_file.xlsx")aswriter:df1.to_excel(writer,sheet_name="Sheet1")df2.to_excel(writer,sheet_name="Sheet2")如果有时间变量,输出时也可以在date_format中指定时间的格式。另外还可以通过模式设置输出到已有的excel文件,非常灵活。withExcelWriter("path_to_file.xlsx",mode="a",engine="openpyxl")aswriter:df.to_excel(writer,sheet_name="Sheet3")2.pipe管道函数可以加载多个自定义函数到中同样的操作,整个代码更加简洁紧凑。比如我们在做数据清洗的时候,代码往往会很乱,包括去重,去异常值,编码转换等等,如果用pipe的话,会是这个样子。diamonds=sns.load_dataset("diamonds")df_preped=(diamonds.pipe(drop_duplicates).pipe(remove_outliers,['price','carat','depth']).pipe(encode_categoricals,['cut','颜色','清晰']))两个字,干净!3.factorizefactorize函数类似于sklearn中的LabelEncoder,可以实现同样的功能。#注意末端的[0]diamonds["cut_enc"]=pd.factorize(diamonds["cut"])[0]>>>diamonds["cut_enc"].sample(5)52103239813031843010675066340Name:cut_enc,dtype:int64不同之处在于factorize返回一个二进制元组:编码列和唯一分类值列表。代码,unique=pd.factorize(diamonds["cut"],sort=True)>>>codes[:10]array([0,1,3,1,3,2,2,2,4,2],dtype=int64)>>>unique['Ideal','Premium','VeryGood','Good','Fair']4。explodeexplode爆炸函数,可以将列表等类似数组的值转换成多行。data=pd.Series([1,6,7,[46,56,49],45,[15,10,12]]).to_frame("dirty")data.explode("dirty",ignore_index=True)5.squeeze很多时候,我们用.loc过滤,想要返回一个值,但是返回的是一个series。其实只要用.squeeze()就可以完美解决。例如:#不使用squeezesubset=diamonds.loc[diamonds.index<1,["price"]]#使用squeezesubset.squeeze("columns")可以看到压缩后的结果已经是int64格式了,没有更长是系列。6.betweendataframe、commonloc、isin等的筛选方法有很多,但其实有一个极其简洁的方法,专门用于筛选数值范围,isbetween,用法非常简单。钻石[钻石[“价格”]\.between(3500,3700,inclusive="neither")].sample(5)7.T这是所有dataframe都有的简单属性,实现了转置功能。它在显示描述时效果很好。boston.describe().T.head(10)8.pandasstylerpandas也可以像excel一样设置表格的可视化条件格式,只需要一行代码(可能需要一点前端HTML和CSS的基础知识)。>>>diabetes.describe().T.drop("count",axis=1)\.style.highlight_max(color="darkred")当然,条件格式有很多种。9、pandas选项pandas提供了很多宏设置选项,分为以下五类。dir(pd.options)['compute','display','io','mode','plotting']一般用display会比较多,比如最大最小显示行数,绘图方式,显示精度等等等等。pd.options.display.max_columns=Nonepd.options.display.precision=510.convert_dtypes经常使用pandas的都知道,pandas往往会直接将变量类型转换为对象,导致后续无法正常运行。这种情况下可以使用convert_dtypes进行批量转换,自动推断出数据的原始类型,实现转换。sample=pd.read_csv("data/station_day.csv",usecols=["StationId","CO","O3","AQI_Bucket"],)>>>sample.dtypesStationIdobjectCOfloat64O3float64AQI_Bucketobjectdtype:对象>>>sample.convert_dtypes().dtypesStationIdstringCOfloat64O3float64AQI_Bucketstringdtype:object11。当select_dtypes需要过滤变量类型时,可以直接使用select_dtypes通过include和exclude过滤排除变量类型。#选择数值变量diamonds.select_dtypes(include=np.number).head()#排除数值变量diamonds.select_dtypes(exclude=np.number).head()12.maskmask可在自定义条件下快速设置mask替换单位值,在很多第三方库的源码中经常看到。比如我们要让年龄不是50-60的单元为空,只需要在con和ohter中写自定义条件即可。ages=pd.Series([55,52,50,66,57,59,49,60]).to_frame("ages")ages.mask(cond=~ages["ages"].between(50,60)),other=np.nan)13.列轴的min和max虽然min和max的作用大家都知道,但是应用到列上应该很少见。这对函数其实可以这样使用:index=["Diamonds","Titanic","Iris","HeartDisease","LoanDefault"]libraries=["XGBoost","CatBoost","LightGBM","SklearnGB"]df=pd.DataFrame({lib:np.random.uniform(90,100,5)forlibinlibraries},index=index)>>>df>>>df.max(axis=1)钻石99.52684泰坦尼克号99.63650虹膜99.10989心脏病99.31627贷款违约97.96728dtype:float6414。nlargest,nsmallest有时我们不仅想要一列的min/max值,还想要一个变量的前N个或~(topN)个值。这就是nlargest和nsmallest派上用场的地方。diamonds.nlargest(5,“价格”)15。idmax,idxmin当我们对列轴使用max或min时,pandas将返回最大/最小值。但是我现在不需要具体的值,我需要这个最大值的位置。这个需求还是很普遍的,因为经常需要锁住位置,然后对整行进行操作,比如提取或者删除单行。用idxmax和idxmin来解决。>>>diamonds.price.idxmax()27749>>>diamonds.carat.idxmin()1416。value_counts在探索数据时,value_counts是一个非常常用的函数。它默认不统计空值,但是空值往往是我们关心的。如果要统计空值,可以将参数dropna设置为False。ames_housing=pd.read_csv("data/train.csv")>>>ames_housing["FireplaceQu"].value_counts(dropna=False,normalize=TrueNaN0.47260Gd0.26027TA0.21438Fa0.02260Ex0.01644Po0.01Fire370Name:float6417.clipOutlierdetection是数据分析中常见的操作,使用clip函数可以轻松找到变量范围外的离群值并替换掉。>>>age.clip(50,60)18.at_time,between_time这两个函数超级好用的时候粒度比较细。因为他们可以进行更细粒度的操作,比如过滤某个时间点,或者某个时间范围等,可以细化到小时和分钟。>>>data.at_time("15:00")fromdatetimeimportdatetime>>>data.between_time("09:45","12:00")19.hasnanspandas提供了一个快速方法hasnans来检查给定的系列是否包含空值。series=pd.Series([2,4,6,"sadf",np.nan])>>>series.hasnansTrue此方法只适用于series结构20.GroupBy.nthThis函数仅适用于GroupBy对象。具体来说,分组后,nth返回每组的第n行:>>>diamonds.groupby("cut").nth(5)