从熊猫数据集中快速删除不需要的数据的最佳方法是什么?

时间:2019-12-23 08:26:19

标签: python pandas

我有一个像表一样格式的大型数据集(14列x 10M行)。其中一些项目可能是NaN,这是我不想要的,对于两列“ x0”和“ y0”,我想删除-30至+30之外的值。

如下所示,我的代码一次遍历数据集一行,而且速度非常慢。有没有更有效的方法来删除我不想要的行?

def cleanDataset(dataset):

    findNanYs = pd.isnull(dataset)
    forDeletion = []

    for i in range(0,dataset.shape[0]):
        if findNanYs.T.any()[i]:  # strike NaN
            forDeletion.append(i)
        elif abs(dataset['x0'][i]) > 30:
            forDeletion.append(i)        
        elif abs(dataset['y0'][i]) > 30:
            forDeletion.append(i)        

    cleanDS = dataset.drop(forDeletion, axis=0)
    return cleanDS

3 个答案:

答案 0 :(得分:1)

除了上面给出的 dropna 之外,还使用查询来过滤数据,这对于大表来说在内存方面效率更高,就像这样简单:

dataset.query('-30 < x0 < 30', inplace=True)

答案 1 :(得分:0)

尝试:

您可以找到有关dropna here

的更多信息。
This drops NaN rows.
dataset = dataset.dropna(how=any)

# And you can filter and drop unwanted data as below
dataset = dataset.loc[abs(dataset['x0']) > 30]
dataset = dataset.loc[abs(dataset['y0']) > 30]

答案 2 :(得分:0)

您可以尝试:

# set number of rows
nrows = 50

# generate dataframe
a = np.random.randn(nrows)
mask = np.random.choice([1, 0], a.shape, p=[.1, .9]).astype(bool)
a[mask] = np.nan
df = pd.DataFrame({'A': a, 'x0': np.random.randint(-50, 50, nrows), 'y0': np.random.randint(-50, 50, nrows)})

# drop rows
df.x0 = df.x0.where(abs(df.x0) <= 30)
df.y0 = df.y0.where(abs(df.y0) <= 30)
df.dropna()