#python #python-3.x #pandas #dataframe
#python #python-3.x #pandas #фрейм данных
Вопрос:
У меня есть фрейм данных, df , в котором я пытаюсь заполнить значения в пустом столбце «Set», в зависимости от условия. Условие следующее: значение столбцов ‘Set’ должно быть «IN» всякий раз, когда значение столбца ‘valence_median_split’ равно ‘Low_Valence’ в соответствующей строке, и «OUT» во всех остальных случаях.
Пожалуйста, смотрите ниже пример моей попытки решить эту проблему:
df.head()
Out[65]:
ID Category Num Vert_Horizon Description Fem_Valence_Mean
0 Animals_001_h Animals 1 h Dead Stork 2.40
1 Animals_002_v Animals 2 v Lion 6.31
2 Animals_003_h Animals 3 h Snake 5.14
3 Animals_004_v Animals 4 v Wolf 4.55
4 Animals_005_h Animals 5 h Bat 5.29
Fem_Valence_SD Fem_Av/Ap_Mean Fem_Av/Ap_SD Arousal_Mean ... Contrast
0 1.30 3.03 1.47 6.72 ... 68.45
1 2.19 5.96 2.24 6.69 ... 32.34
2 1.19 5.14 1.75 5.34 ... 59.92
3 1.87 4.82 2.27 6.84 ... 75.10
4 1.56 4.61 1.81 5.50 ... 59.77
JPEG_size80 LABL LABA LABB Entropy Classification
0 263028 51.75 -0.39 16.93 7.86
1 250208 52.39 10.63 30.30 6.71
2 190887 55.45 0.25 4.41 7.83
3 282350 49.84 3.82 1.36 7.69
4 329325 54.26 -0.34 -0.95 7.82
valence_median_split temp_selection set
0 Low_Valence Animals_001_h
1 High_Valence NaN
2 Low_Valence Animals_003_h
3 Low_Valence Animals_004_v
4 Low_Valence Animals_005_h
[5 rows x 36 columns]
df['set'] = np.where(df.loc[df['valence_median_split'] == 'Low_Valence'], 'IN', 'OUT')
ValueError: Length of values does not match length of index
Я могу выполнить это, используя loc для разделения df на два разных df, но мне интересно, есть ли более элегантное решение, использующее «np.where» или аналогичный подход.
Ответ №1:
Изменить на
df['set'] = np.where(df['valence_median_split'] == 'Low_Valence', 'IN', 'OUT')
При необходимости .loc
df.loc[df['valence_median_split'] == 'Low_Valence','set']='IN'
df.loc[df['valence_median_split'] != 'Low_Valence','set']='OUT'
Комментарии:
1. Вы знаете, могут ли df.where или df.loc работать с методом .sample? Итак, если я попытаюсь случайным образом выбрать 200 строк из столбца, которые удовлетворяют определенному условию. Похоже, что этот способ генерирует ошибку: df[‘temp_selection’] = np.где(df[‘valence_median_split’] == ‘Low_Valence’, df[‘valence_median_split’].sample(n = 200), ‘OUT’)
2. @arkadiy np.где этого можно добиться, добавив переиндексацию
np.where(df['valence_median_split'] == 'Low_Valence', df['valence_median_split'].sample(n=200).reindex(df.index), 'OUT')