pandas - удаление строк, содержащих nans - игнорирование столбцов - PullRequest
0 голосов
/ 10 июня 2018

Я хочу иметь возможность удалять из фрейма данных (orig) строки, которые соответствуют строкам в производном фрейме данных (filtered), которые содержат NaN значения в них.Проблема в том, что у производного фрейма данных есть удаленный столбец, который вызывает удаление каждой строки .Чтобы исправить это, я должен заново вставить удаленный столбец.Есть ли более элегантный способ достижения желаемого результата, чем повторная вставка в filtered столбца, удаленного из него?

>>> orig = pd.DataFrame([
                         [1, 1.0, 'one'], 
                         [2, 2.0, 'two'],
                         [100, 100.0, 'one-hundred']
                        ], columns=['Integers', 'Floats', 'Strings'])
>>> numeric = orig.select_dtypes(include=['int', 'float'])
>>> numeric
   Integers  Floats
0         1     1.0
1         2     2.0
2       100     100.0
>>> filtered = numeric[np.abs(numeric - numeric.mean())<=(numeric.std())].dropna()
>>> filtered
   Integers  Floats
0       1.0     1.0
1       2.0     2.0

Следующая строка вернет пустой фрейм данных, поскольку filtered не имеет столбца Strings в нем и, таким образом, исключает каждую строку из orig.

>>> removed_rows = orig[orig.isin(filtered)].dropna()

Я должен повторно вставить нечисловой столбец, удаленный во второй строке, перед запуском строки кода выше:

>>> filtered['Strings'] = orig['Strings']

чтобы наконец получить желаемый результат:

>>> removed_rows
   Integers  Floats Strings
0       1.0     1.0     one
1       2.0     2.0     two

Если это единственный способ сделать это, то это нормально - но я надеялся на более элегантный способ сделать это.Есть ли?

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Индекс в orig.

orig[(np.abs(numeric - numeric.mean()) <= (numeric.std())).all(axis=1)]

Или

orig[(np.abs(numeric - numeric.mean()) <= (numeric.std())).min(axis=1)]

   Integers  Floats Strings
0         1     1.0     one
1         2     2.0     two
0 голосов
/ 10 июня 2018

Почему бы не

orig[orig.isin(filtered).max(1).astype(bool)]
    Integers    Floats  Strings
0   1           1.0     one
1   2           2.0     two

или

orig[orig.isin(filtered).sum(1).astype(bool)]

    Integers    Floats  Strings
0   1           1.0     one
1   2           2.0     two
0 голосов
/ 10 июня 2018

Используйте DataFrame.all для проверки всех True с в строке:

orig[(np.abs(numeric - numeric.mean()) <= (numeric.std())).all(axis=1)] 

В пандах 0.23.0 по какой-то причине numeric возврат только столбца float.

print (orig.dtypes)
Integers      int64
Floats      float64
Strings      object
dtype: object

print (orig.select_dtypes(include=['int', 'float']))
   Floats
0     1.0
1     2.0
2   100.0

Так что лучше использовать np.number:

print (orig.select_dtypes(include=np.number))
   Integers  Floats
0         1     1.0
1         2     2.0
2       100   100.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...