当前位置: 首页 > 知识库问答 >
问题:

过滤大型数据帧的更快方法是什么?

巢权
2023-03-14

我想对大约40万行的数据帧进行排序,其中包含4列,用if语句取出大约一半:

    for a in range (0, howmanytimestorunthrough): 
        if ('Primary' not in DataFrameexample[a]):
            #take out row

到目前为止,我一直在测试以下4个中的任何一个:

newdf.append(emptyline,)
nefdf.at[b,'column1'] = DataFrameexample.at[a,'column1']
nefdf.at[b,'column2'] = DataFrameexample.at[a,'column2']
nefdf.at[b,'column3'] = DataFrameexample.at[a,'column3']
nefdf.at[b,'column4'] = DataFrameexample.at[a,'column4']
b = b + 1

或与.loc相同

newdf.append(emptyline,)
nefdf.loc[b,:] = DataFrameexample.loc[a,:]
b = b + 1

或者将if(非in)改变为if(in)并使用:

DataFrameexample = DataFrameexample.drop([k])

或者尝试将emptyline设置为具有值,然后将其附加:

notemptyline = pd.Series(DataFrameexample.loc[a,:].values, index = ['column1', 'column2', ...) 
newdf.append(notemptyline, ignore_index=True)

因此,从我到目前为止设法测试的内容来看,它们似乎在少量行(2000)上都可以正常工作,但是一旦我开始获得更多的行,它们所需的时间就会呈指数级增长。.at 似乎比 .loc 快一点,即使我需要它运行 4 次,但仍然变慢(行的 10 倍,需要超过 10 倍的时间)。.drop 我认为每次都尝试复制数据帧,所以真的不起作用吗?我似乎无法让.append(注意空线)正常工作,它只是一遍又一遍地替换索引0。

我知道必须有一个有效的方法来做到这一点,但我似乎无法做到。需要帮忙吗?

共有1个答案

东方和惬
2023-03-14

你的速度问题和。loc vs .at vs...(比较……loc和。看一看这个问题)而是来自对数据帧的每一行的显式循环。熊猫是所有关于矢量化您的操作。

您希望基于比较筛选数据帧。您可以将其转换为布尔索引器。

indexer = df!='Primary'

这将为您提供一个带有布尔值的4x n行数据框架。现在,您希望将维度减少到1 x n行,这样,如果行(轴1)中的所有值都为真,则值为真。

indexer = indexer.all(axis=1)

现在我们可以使用. loc只获取被索引的行是True

df = df.loc[indexer]

这将比遍历行快得多。

编辑:

要检查df条目是否包含字符串,您可以替换第一行:

indexer = df.apply(lambda x: x.str.contains('Primary'))

请注意,您通常不想使用应用语句(内部它对自定义函数使用for循环)来迭代很多元素。在这种情况下,我们在列上循环,如果您只有几个列,这很好。

 类似资料:
  • 我有两个数据帧和包含IP地址,我正在尝试将IP地址映射到地理位置信息,如经度和纬度,它们是中的列。 我运行它作为一个火花提交作业,但操作花了很长时间,即使只有不到2500行。 我的代码: 有没有其他方法可以加入这两张桌子?还是我做错了?

  • 使用Spark SQL,我有两个数据帧,它们是从一个数据帧创建的,例如: 我想过滤df1,如果它的“路径”的一部分是df2中的任何路径。所以如果df1有路径为“a/b/c/d/e”的行,我会找出df2中是否有路径为“a/b/c”的行。SQL应该是这样 其中udf是用户定义的函数,用于缩短df1的原始路径。简单的解决方案是使用JOIN,然后过滤结果,但这很慢,因为df1和df2都有超过10mil的行

  • 我需要用大量的整数值预先填充列表。 除了迭代,还有更快的方法吗? 当前代码: 此代码位于一个非常频繁创建的类的构造函数中,因此我希望它尽可能高效(read:性能而不是代码行)

  • 我有一个包含不同单词和信息的词汇表。它的大小约为100MB。然而,搜索这个文件需要很长时间。有什么方法可以提高我查找数据的速度吗?例如,我正在考虑编写一个程序,将文本文件拆分为26个不同的文本文件(按单词的第一个字母),然后,程序只需要检查给定单词的第一个字母,就可以搜索一个小得多的文件。这会提高程序的执行时间吗?有什么有效的结构化数据可以存储文件吗?例如json。另外,数据库呢?我使用静态编程语

  • 问题内容: 在我的生产数据库中,使用默认字符集“ latin”创建了与警报相关的表,因此,当我们尝试在表中插入日文字符时遇到错误。我们需要将表和列的默认字符集更改为UTF8。由于这些表中包含大量数据,Alter命令可能会花费很多时间(在具有相同数据量的本地DB中花费了5个小时)并锁定了表,这将导致数据丢失。我们是否可以计划一种将字符集更改为UTF8而不丢失数据的机制。 更改大型数据表的字符集的更好

  • 我试图子集一个熊猫DataFrame在python基于两个逻辑语句 即。 但是第3行的语法无效。 有没有一种方法可以在一行中完成?