提高 Pandas 数据帧过滤速度

数据挖掘 Python 熊猫 表现
2021-10-05 02:05:10

我有一个包含 19 列和大约 250k 行的数据集。我曾使用过更大的数据集,但这一次,Pandas 决定玩弄我的神经。

我尝试根据一些简单的规则将原始数据集拆分为 3 个子数据帧。但是,执行代码需要很长时间。过滤大约需要 15-20 秒。

任何可以提高代码性能的替代方法?

import pandas as pd

#read dataset
df = pd.read_csv('myData.csv')

#create a dataframe with col1 10 and col2 <= 15
df1 = df[(df.col1 == 10) & (df.col2 <= 15)]
df = df[~df.isin(df1)].dropna()

#create a dataframe with col3 7 and col4 >= 4
df2 = df[(df.col3 == 7) & (df.col4 >= 4)]
df = df[~df.isin(df2)].dropna()

最后,我得到了df1, df2, df带有过滤数据的数据框。

3个回答

要理解的概念是条件实际上是一个向量。因此,您可以简单地定义条件,然后将它们进行逻辑组合,例如:

condition1 = (df.col1 == 10) & (df.col2 <= 15)
condition2 = (df.col3 == 7) & (df.col4 >= 4)

# at this point, condition1 and condition2 are vectors of bools

df1 = df[condition1]
df2 = df[condition2 & ~condition1]
df = df[~ (condition1 | condition2)]

这将相当快,因为​​它只评估条件一次。然后它使用它们执行索引查找以创建新的更小的数据帧。

您是否计算过代码中哪一行最耗时?我怀疑这条线df = df[~df.isin(df1)].dropna()需要很长时间。当您想过滤掉fromdf1中的行时,如果您简单地使用您应用的条件的否定来获得它会更快吗?df1df

也就是说,使用df = df[(df.col1 != 10) | (df.col2 > 15)].

除了其他答案中的建议之外,如果我们将搜索字段添加到 DataFrame 索引中会有所帮助。参考:https ://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html

Pandas DataFrames 也支持多索引。参考:https ://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html

一个例子可以在这里找到https://stackoverflow.com/a/58061800/2130670