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

11个PythonPandas小技巧,让你的工作更高效(附代码示例)

时间:2023-03-13 17:10:52 科技观察

本文为您介绍隐藏在Pandas中的炫酷技巧,相信这些会对你有所帮助。也许您已经知道本文中的一些命令,但您只是没有意识到还有另一种打开方式。Pandas是Python中广泛使用的数据分析包。市面上有很多关于Pandas的经典教程,但本文介绍了一些很酷的隐藏技巧,相信会对你有所帮助。1.read_csv这是读取数据的入门级命令。当你要读取的数据量特别大的时候,试试加上这个参数nrows=5,可以先读取一小部分数据,然后再加载所有数据。这样就可以避免出现分隔符选错等错误(数据不一定要用逗号隔开)。(或者在linux系统上,您可以使用'head'来显示任何文本文件的前五行:head-c5data.txt)接下来,使用df.columns.tolist()提取每一列并将其转换为列表。您还可以添加usecols=['c1','c2',...]以加载所需的指定列。另外,如果知道某些列的类型,可以加上dtype={‘c1’:str,‘c2’:int,…},这样可以加快加载速度。添加这些参数还有一个很大的好处就是,如果这个列同时包含字符串和数值类型,并且你事先声明你把这个列当作一个字符串,那么当这个列作为主键来融合多个表时,会没有报错。2.select_dtypes如果在Python中已经完成了数据预处理,这个命令可以为你节省一定的时间。读取表格后,每列的默认数据类型将是bool、int64、float64、object、category、timedelta64或datetime64。首先,你可以观察大概的情况,使用:df.dtypes.value_counts()了解你的dataframe的每一种数据类型,然后使用:df.select_dtypes(include=['float64','int64'])来得到一个仅由数字类型组成的子数据框。3.copy如果你没听说过,我怎么强调它的重要性都不为过。输入以下命令:importpandasaspddf1=pd.DataFrame({'a':[0,0,0],'b':[1,1,1]})df2=df1df2['a']=df2['a']+1df1.head()你会发现df1变了。这是因为df2=df1并没有创建df1的副本并将其赋值给df2,而是设置了指向df1的指针。因此,只要是针对df2的更改,它也会相应地应用于df1。要解决这个问题,您可以这样做:df2=df1.copy()或这样做:fromcopyimportdeepcopydf2=deepcopy(df1)4.酷炫的命令映射使您的数据转换变得简单。首先定义一个字典,“key”为转换前的旧值,“values”为转换后的新值。level_map={1:'high',2:'medium',3:'low'}df['c_level']=df['c'].map(level_map)几种适用场景:将True,False,转化为1,0(用于建模);定义级别;使用字典编码。5.你使用apply吗?如果我们想在现有列的基础上生成一个新的列,并一起作为输入,有时apply函数会非常有用。defrule(x,y):ifx=='high'andy>10:return1else:return0df=pd.DataFrame({'c1':['high','high','low','low'],'c2':[0,23,17,4]})df['new']=df.apply(lambdax:rule(x['c1'],x['c2']),axis=1)df.head()在上面的代码中,我们定义了一个有两个输入变量的函数,并依靠apply函数让它作用于列“c1”和“c2”。但是apply函数在某些情况下确实太慢了。如果你想计算“c1”和“c2”列的最大值,当然你可以这样做:df['maximum']=df.apply(lambdax:max(x['c1'],x['c2']),axis=1)但你会发现apply比下面的命令慢得多:df['maximum']=df[['c1','c2']].max(axis=1)结论:如果可以使用其他内置函数(它们通常更快),请不要使用apply。例如,如果要将“c”列的值四舍五入为近似整数,请使用round(df['c'],0)或df['c'],round(0)而不是上面的apply功能。7.valuecounts该命令用于检查值的分布情况。如果要查看“c”列中出现的值以及每个值出现的频率,可以使用:df['c'].value_counts(这里有一些有用的提示/参数:normalize=True:查看每个一个值出现的频率而不是出现的次数。dropna=False:保留本次统计中的缺失值。sort=False:按值而不是出现的次数对数据进行排序。df['c].value_counts().reset_index():将这个统计表转化为pandasdataframe并进行处理8.缺失值个数在建立模型的时候,我们可能会去掉缺失值过多或者全部缺失的行values.这时候可以使用.isnull()和.sum()来统计指定列的缺失值个数。importpandasaspdimportnumpyasnpdf=pd.DataFrame({'id':[1,2,3],'c1':[0,0,np.nan],'c2':[np.nan,1,1]})df=df[['id','c1','c2']]df['num_nulls']=df[['c1','c2']].isnull().sum(axis=1)df.head()在SQL中,我们可以使用SELECT*FROM...WHEREIDin('A001','C022',...)来获取包含指定ID的记录。如果你想在Pandas中做类似的事情,你可以使用:df_filter=df['ID'].isin(['A001','C022',...])df[df_filter]10。基于分位数分组,面对一列数值,你想对这一列的数值进行分组,比如前5%分到第1组,5-20%分到第2组,20%-50%分到第2组第3组,50%的最佳人选进入第4组。当然,你可以使用pandas.cut,但你也可以使用这个选项:importnumpyasnpcut_points=[np.percentile(df['c'],i)foriin[50,80,95]]df['group']=1foriinrange(3):df['group']=df['group']+(df['c']