我有一个像表一样格式的大型数据集(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
答案 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()