2016-11-12 4 views
3

Я пытаюсь удалить выбросы из набора данных. Для того, чтобы сделать это, я использую:Как удалить строки из фрейма данных?

df = df[df.attr < df.attr.mean() + df.attr.std()*3] 

Это, кажется, работает, как ожидалось, но, когда я делаю что-то вроде:

for i in xrange(df.shape[0]): 
    print df.attr[i] 

Тогда я получаю KeyError. Кажется, что Pandas фактически не возвращает новый DataFrame с опущенными рядами. Как я могу удалить эти строки и получить полностью функциональный DataFrame?

ответ

2

Во-первых, найти индексы, которые удовлетворяют критериям (которые в ваш случай - df.attr < df.attr.mean() + df.attr.std() * 3).

x = df.loc[:,attr] < df.attr.mean() + df.attr.std()*3 

Дальше, используйте DataFrame.drop.

df.drop(x[x].index) 

См ответы, такие как How to drop a list of rows from Pandas dataframe? для получения дополнительной информации

2

Я думаю, что нужно DataFrame.ix:

for i in xrange(df.shape[0]): 
    print df.ix[i, 'attr'] 

Или Series.iloc:

for i in xrange(df.shape[0]): 
    print df.attr.iloc[i] 

решение проще с Series.iteritems:

for i, val in df.attr.iteritems(): 
    print (val) 
+1

Я искушен, чтобы принять ваш ответ, так как это на самом деле лучшее решение по моему делу, но кто-то погуглить эти ключевые слова, возможно, на самом деле нужно отбросить строки (по разным причинам), поэтому я соглашусь с другим. – MaiaVictor

+0

Я немного удивлен, я думаю, что ['boolean indexing'] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing) лучше, чем падение, но это зависит от вы. удачи :) – jezrael