Игнорирование строк, созданных с помощью pandas «where»

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

Мне интересно, есть ли способ пропустить строки, когда я переназначаю значения из числа в строку:

 s = pd.Series(np.arange(1,100,1))
  

Что я пытаюсь сделать, так это получить 1-е и 2-е стандартное отклонение от моих выборочных данных:

 s = s.where((s <= s.std() *1) amp; (s >= s.std() *-1), "1_StDev", errors="ignore")
s = s.where((s <= s.std() *2) amp; (s >= s.std() *-2), "2_StDev", errors="ignore")
  

Но, похоже, мой код по-прежнему возвращает ошибку, несмотря на установку параметра error на "ignore" .

Кроме того, мне интересно pd.cut , возможно ли это здесь. Если да, пожалуйста, научите меня, как это сделать.

Комментарии:

1. Ошибка не из where . После исключения первой строки есть int s и "1_StDev" in s , которые вы используете для получения нового std во второй строке.

2. @Chris, ты прав, поэтому при настройке errors="ignore" where метод where не будет игнорировать строку? кроме того, я попытался добавить s.apply(lambda x: isinstance(x,int)) в микс, но это мне не помогло

Ответ №1:

Здесь вы можете использовать np.select

 conditions = [(s <= s.std() *1) amp; (s >= s.std() *-1), 
              (s <= s.std() *2) amp; (s >= s.std() *-2)]
choices = ["1_StDev", "2_StDev"]

s = pd.Series(np.select(conditions, choices))
  

Лучше установить значение по умолчанию, как предлагает @Chris, для значений, где условия не совпадают.

 s = pd.Series(np.select(conditions, choices, default=s))
  

Комментарии:

1. Хороший ответ; но я бы добавил default=s numpy.select , чтобы строки, которые не соответствовали условиям, остались нетронутыми 😉

Ответ №2:

Проблема в том, что при вызове второй строки вы уже преобразовали часть ряда в строку, и поэтому при сравнении строки с плавающей точкой возникает ошибка.