全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
728 0
2020-12-23
Pandas Express上的所有功能–如何在Python中使用Pandas加快数据预处理
Pandas是一个非常受欢迎的库,即使非Python程序员和数据科学专业人士也对此有所了解。而且,如果您是一位经验丰富的Python程序员,那么您将非常熟悉Pandas库的灵活性。
但是Pandas的问题在于,在某些情况下,它的速度可能会令人难以忍受,尤其是当我们处理大量数据时。在当今的截止日期驱动的世界中,效率通常是成功的数据科学项目和失败的数据科学项目之间的区别。
那么,我们如何提高数据预处理任务的效率呢?我们可以通过一些调整来利用Pandas来加快我们的数据科学任务吗?
预处理熊猫
在本文中,我们将重点介绍两个常见的数据预处理任务,我经常会看到数据科学家苦苦挣扎的事情:
装箱
向数据框添加行
我们将讨论执行这两项任务的不同方法,并找到可以提高效率的最快方法。我们将在熊猫的帮助下完成所有这些工作!
我强烈建议您参加以下免费课程,以成为更有效率的数据科学家或分析师:
熊猫用Python进行数据分析
数据科学技巧,窍门和技巧!
目录
让我们将数据集加载到我们的Python环境中
熊猫任务1:分箱
方法1:蛮力
方法2:iterrows()
方法3:apply()
方法4:cut()
熊猫任务2:向DataFrame添加行
方法1:使用附加功能
方法2:Concat函数
让我们将数据集加载到我们的Python环境中
这将是尽可能动手的。我个人认为边做边学–这就是我们在本文中将遵循的想法。
我们将为这两种预处理任务找到最快的技术,并利用一些鲜为人知的Pandas功能来完成此任务。现在,让我们启动Jupyter Notebook或IDE,并加载数据集。
我们将使用“汽车”数据集进行实验。您可以从此处下载它,或者如果您正在使用seaborn库进行可视化-它已经具有“汽车”数据集。
#导入库
将熊猫作为pd导入
将numpy导入为np
导入matplotlib.pyplot作为plt
%matplotlib内联
将seaborn导入为sns
让我们将数据集加载到数据框中:
mpg = sns.load_dataset('mpg')
mpg_head()
预处理熊猫-数据头
熊猫任务1:分箱
对于未初始化的对象,合并是将连续变量转换为分类变量。现在,如果要对连续列应用条件,例如在“权重”列上,则可以使用以下内容创建一个新的分类列:
重量> 1500且重量<2500为“轻”
重量> 2500且重量<3500作为“中”
体重> 3500且体重<4500为'重'
重量> 4500作为“非常重”
让我们观察执行此任务的各种方法,并查看是否可以使用Pandas优化此预处理任务。
方法1:蛮力
最慢的暴力破解方法是遍历每一行,然后对该行进行相应的分类。为此,我们首先创建一个检查重量值并为其分配类别的函数:
def apply_weights(weight):
    如果1500 <=重量<2500:
        类别=“光”
    Elif 2500 <=重量<3500:
        类别=“中”
    Elif 3500 <=重量<4500:
        类别=“重”
    其他:
        类别=“非常重”
    返回类别
然后,我们获取“权重”列,并将每行的值传递给上述函数:
%% timeit
cat_list = []
对于我在范围内(len(mpg)):
    wt = mpg.iloc [i] ['weight']
    猫= apply_weights(wt)
    cat_list.append(cat)
mpg ['Wt_Categories'] = cat_list
让我们利用timeit实用程序来计算完成上述任务所需的时间。为此,我们只需将%% timeit添加到要运行的代码单元中。
输出:
mpg.head()
预处理熊猫-称重头
以及完成上述任务所需的时间:
预处理熊猫-时间
显然,此循环要花费大量时间来执行,而且行数越多,操作的速度就越慢。不理想!
方法2:iterrows()
让我们利用Pandas中的iterrows()函数来加快此过程。该iterrows功能基本上是这样的语句的优化版本:
对于我在范围内(len(mpg)):
这使我们可以处理单个行。如您所见,我们避免了使用iloc,并且可以像在数据框中那样访问每一行的weight列:
%% timeit
cat_list = []
对于索引,在mpg.iterrows()中的行:
    wt =行['weight']   
    猫= apply_weights(wt)
    cat_list.append(cat)
#print(len(cat_list))
mpg ['Wt_Categories_iter'] = cat_list
让我们确认新列:
mpg.head()
预处理熊猫-iterror()
和执行时间:
预处理熊猫-时间
大!我们将整个时间减少了30毫秒!请记住,对于较大的数据集和复杂的函数,这种差异将更加明显。
如果我说我们可以加快速度,您会相信我吗?让我们看看如何。
方法3:apply()
apply()方法允许沿特定轴(行为0,列为1)应用给定函数。在内部,apply()也用于循环,但是有很多优化,我们在这里不做介绍。
%% timeit
mpg ['wt_cat_apply'] = mpg.apply(lambda行:apply_weights(row ['weight']),轴= 1)
与之前一样,让我们??确认新列和执行时间:
mpg.head()
预处理熊猫-数据头

预处理熊猫-时间
奇妙!我们的代码开始时需要花费75毫秒的时间来执行,而我们最终只花费了大约7毫秒的时间来执行该函数。此外,我们还可以使用更清晰的代码来完成此任务。
但是,如果您观察到,上述方法仍然存在一些约束:
我们仍然必须编写繁琐的函数apply_weights(),并对权重类别使用多个条件语句。对于4个类别,这可能看起来很简单,但是对于6个或更多类别,我们的工作就可以完成了
同样,我们不能总是确定每个重量类别的上下限,因为在确定类别间隔时也可能有很多歧义
类别间隔不均匀–这不直观
不费吹灰之力– Pandas也具有可自动执行分类过程并消除上述限制的实用程序!
方法4:cut()
我们使用Pandas库的cut()函数执行此预处理任务,从而自动对数据进行装箱。我们只需要知道要将栏归类到的四个类别,cut函数会将数据分为这些类别。
%% timeit
mpg ['wt_cat_cut'] = pd.cut(np.array(mpg ['weight']),4,标签= [“轻”,“中”,“重”,“非常重”]))
以及新列:
惊人!我们仅用了1毫秒左右的时间就对数据进行了分类-与我们最初使用的72毫秒有明显的区别,并且对apply()函数进行了显着改进。
总结一下,这是我们的结果:
熊猫任务2:向数据框添加行
让我们尝试将新行添加到现有数据框。执行此操作的两种常见方法是:
附加
康卡特
这两个都属于Pandas库,需要进行比较以了解哪种方法可以帮助我们有效地实现将行添加到数据帧的预处理技术。
让我们找到最快的方法。为此,让我们创建3个简单的数据框:
raw_data = {
'subject_id':['1','2','3','4','5'],
'first_name':['Alex','Amy','Allen','Alice','Ayoung'],
'last_name':['Anderson','Ackerman','Ali','Aoni','Atiches']}
df_a = pd.DataFrame(原始数据,列= ['subject_id','first_name','last_name'])
df_a
raw_data = {
        'subject_id': ['4'
        'first_name': ['Billy'
        'last_name': ['Bonder'
df_b = pd.DataFrame(raw_data
df_b
raw_data = {
'subject_id':['6','5','1','3','9'],
'first_name':['Jason','Molly','Tina','Jake','Amy'],
'last_name':['Miller','Jacobson','Ali','Milner','Cooze']}
df_c = pd.DataFrame(原始数据,列= ['subject_id','first_name','last_name'])
df_c
方法1:使用附加功能
我们将使用append()函数将数据帧的行添加到现有数据帧的末尾。此函数非常有用,因为它具有“ verify_integrity”之类的参数,如果要添加具有重复索引的行,则会引发错误。我们还可以使用sort参数按列对结果数据框进行排序。
虽然将一个数据帧的行添加到另一个数据帧非常简单,但是当我们必须将3个或更多数据帧添加在一起时,我们会遇到问题。我们不能将多个数据框作为参数传递给append函数。因此,我们别无选择,只能追加2个数据帧并将其结果追加到第3个数据帧。
当涉及更多数据帧时,这可能特别繁琐。
以下是Python代码–让我们评估执行此操作所需的时间。请记住,请将ignore_index参数设置为True,以便新数据帧的索引范围为0到n-1:
%% timeit
temp_df = df_a.append(df_b,ignore_index = True)
df_new = temp_df.append(df_c,ignore_index = True)
新数据框是什么样的?
让我们还看一下该操作花费的时间:
仅添加5行添加3个数据帧就花费了很长时间!显然,如果我们使用更大的数据框,这将花费更长的时间。
我们是否可以优化它并加快这一过程?当然,我们可以。??
方法2:Concat函数
Pandas中的concat函数的功能与NumPy中的concatenate函数非常相似。concat函数的优点之一是它允许的大量参数,例如'axis':0或1,它允许按行或按列连接数据帧,以及verify_integrity和sort。
当我们想按列连接时使用其他参数。与append函数相比,主要优点是我们可以根据需要将尽可能多的数据帧作为参数传递给concat函数。由于我们可以用一行代码将多行加在一起,因此代码更加清晰:
%% timeit
df_concat = pd.concat([df_a,df_b,df_c],轴= 0)
结果数据框:
时钟大约为491微秒,比添加功能花费的时间少得多。尽管这种差异现在看起来可以忽略不计,但对于较大的数据帧而言,这种差异更加明显。另外,append()函数在内部效率较低,因为它涉及使用合并的数据创建新对象。
话虽如此,如果您确实想向数据框中添加单独的行,则最好使用.loc函数:
df_a.loc [5] = ['5','Billy','Bounder']
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群