我想通过一个大约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。在
我知道必须有一个有效的方法来做这件事,我只是似乎不能做到。有什么帮助吗?在
你的速度问题和.loc vs.at vs。。。(对于.loc和.at look之间的比较,请看一下这个question),但这来自于显式循环数据帧的每一行。熊猫就是引导你的行动。在
您希望根据比较筛选数据帧。你可以把它转换成布尔索引器。在
这将为您提供一个具有布尔值的4xn行数据帧。现在,您希望将维度减少到1xn行,这样如果行(轴1)中的所有值都为true,那么该值为true。在
^{pr2}$现在我们可以使用.loc来只获取行was indexer is
True
这将比遍历行快得多。在
编辑:
要检查df条目是否包含字符串,可以替换第一行:
请注意,您通常不希望使用apply语句(在内部,它对自定义函数使用for循环)来迭代许多元素。在这个例子中,我们在列上循环,如果你有两个这样的列就可以了。在
相关问题 更多 >
编程相关推荐