Нежелательные результаты при использовании .sample() с .where() в Python

#python #pandas #numpy #jupyter-notebook #jupyter

#python #pandas #numpy #jupyter-notebook #jupyter

Вопрос:

Я пытаюсь выбрать 2 случайных значения из фрейма данных, где выполняется условие. Пожалуйста, приведите пример df ниже:

 data = {'col1':  ['abc', 'def','ghi','jkl','mno','pqr','stu','vwx','yz'],
        'col2': ['4', '1','4','4','0','1','4','2','4'],
        'col3': ['Sweden', 'Malaysia','Sweden','Venezuela','France','Sweden','Australia','Belgium','Sweden']
        }

df = pd.DataFrame (data, columns = ['col1','col2','col3'])
  

Я хочу выбрать 2 случайных значения из ‘col1’, где ‘col2’ равно 4. Код, который я затем использую, является:

 print(df['col1'].sample(n=2).where(df['col2']==4))
  

При этом желаемый результат является:

 0  abc
6  stu
  

….или

 8  yz
2 ghi 
  

Однако в настоящее время код выдает такие результаты, как:

 7    NaN
3    NaN
  

Это нежелательно в том смысле, что а) я ожидаю увидеть строковое значение в виде текста и б) в то время как значение, соответствующее строке 3, будет соответствовать критериям, значение, соответствующее строке 7, нет, поэтому критерии выполняются не во всех случаях.

ВОПРОСЫ:

  1. Как бы мне изменить свой код таким образом, чтобы он возвращал текстовые значения и только в том случае, если выполняется условие
  2. Как бы мне добавить второе условие, например .where(df['col2']==4) amp; (df['col3']=='Sweden')

Благодарен за любые рекомендации здесь.

Ответ №1:

Возможно, было бы проще сначала отфильтровать ваши данные. Я не уверен, хотите ли вы конкретно использовать .where() , но если нет, это также поможет на вашем следующем шаге добавления дополнительных критериев.

Кроме того, я думаю, что часть вашей проблемы заключается в том, что в вашем df значения col2 являются строками, поэтому вам нужно, чтобы ваша формула находила ‘4’ вместо числа 4.

 df.loc[df['col2'] == '4','col1'].sample(n=2)
  

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

1. Для дополнительного условия я буду использовать следующий код: df.loc[(df['col2'] == '4') amp; (df['col3'] == 'Sweden'),'col1'].sample(n=2)