【问题标题】:What is quicker, (=.at), (=.loc), (.drop), or (.append) to filter a large dataframe?用 (=.at)、(=.loc)、(.drop) 或 (.append) 过滤大型数据帧,哪个更快?
【发布时间】:2018-06-01 16:42:34
【问题描述】:

我想对大约 400k 行、4 列的 Dataframe 进行排序,用 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 (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。

我知道必须有一种有效的方法来做到这一点,但我似乎无法做到这一点。有什么帮助吗?

【问题讨论】:

    标签: python performance pandas dataframe


    【解决方案1】:

    您的速度问题与 .loc 与 .at 与 ... 无关(对于 .loc 和 .at 之间的比较,请查看此 question),但来自显式循环您的每一行数据框。 Pandas 旨在将您的操作矢量化。

    您想根据比较过滤数据框。您可以将其转换为布尔索引器。

    indexer = df!='Primary'
    

    这将为您提供一个带有布尔值的 4 x 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'))
    

    请注意,您通常不希望使用 apply 语句(内部它使用 for 循环来处理自定义函数)来迭代大量元素。在这种情况下,我们将循环遍历列,如果您只有几个列就可以了。

    【讨论】:

    • 谢谢,我想我正在慢慢到达那里。我怎么能改变第一行来测试'Primary'是否是字符串的一部分?我的值如下:Test Primary,Test,Something else,Something Primary,那行似乎只是测试 Primary 是否是整个字符串?
    猜你喜欢
    • 2014-10-12
    • 2018-05-14
    • 1970-01-01
    • 2018-07-03
    • 2018-04-01
    • 1970-01-01
    • 2016-10-16
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多