什么是更快的,(=.at)、(=.loc)、(.drop)或(.append)来过滤大数据帧?

2024-04-18 00:06:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过一个大约400k行、4列的数据帧进行排序,用if语句去掉其中大约一半:

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

到目前为止,我已经测试了以下4种方法中的任何一种:

^{pr2}$

或与.loc相同

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

或将if(not in)更改为if(in)并使用:

DataFrameexample = DataFrameexample.drop([k])

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

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

所以从目前为止我所做的测试来看,它们在少量行(2000行)上似乎都能正常工作,但是一旦我开始获得更多的行,它们所花费的时间就会成倍增长。at似乎比.loc稍微快一点,即使我需要它运行4次,但仍然很慢(行数是10倍,需要的时间超过10倍)。drop我想每次都试图复制数据帧,所以真的不起作用?我似乎无法获取.append(notemptyline)要正常工作,它只是反复替换索引0。在

我知道必须有一个有效的方法来做这件事,我只是似乎不能做到。有什么帮助吗?在


Tags: 数据方法inindexif排序时间not
1条回答
网友
1楼 · 发布于 2024-04-18 00:06:42

你的速度问题和.loc vs.at vs。。。(对于.loc和.at look之间的比较,请看一下这个question),但这来自于显式循环数据帧的每一行。熊猫就是引导你的行动。在

您希望根据比较筛选数据帧。你可以把它转换成布尔索引器。在

indexer = df!='Primary'

这将为您提供一个具有布尔值的4xn行数据帧。现在,您希望将维度减少到1xn行,这样如果行(轴1)中的所有值都为true,那么该值为true。在

^{pr2}$

现在我们可以使用.loc来只获取行was indexer isTrue

df = df.loc[indexer]

这将比遍历行快得多。在

编辑:

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

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

请注意,您通常不希望使用apply语句(在内部,它对自定义函数使用for循环)来迭代许多元素。在这个例子中,我们在列上循环,如果你有两个这样的列就可以了。在

相关问题 更多 >

    热门问题