Каков наилучший способ заполнить каждую строку столбца на основе условия другой ячейки в той же строке? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь заполнить столбец данных «Классификация» строк строками, указывающими, находится ли значение в пределах 200 самых низких или 200 самых высоких значений столбца с именем «Valence_mean».

Итак, еслизначение ячейки в столбце «Valence_mean» находится в 200 самых низких значениях значений столбца, метка в ячейке столбца «Классификация» той же строки должна быть «Low_Valence».В противном случае, если значение ячейки в столбце «Valence_mean» находится в 200 максимальных значениях соответствующей ячейки столбца «Классификация», должно быть «high_valence».

df.head ()

Out[31]: 
  Unnamed: 0      Theme Category   Source  Valence_mean  Valence_SD  \
0         I1   Acorns 1   Object  Pixabay      4.686275    0.954203   
1         I2   Acorns 2   Object  Pixabay      4.519608    0.841150   
2         I3   Acorns 3   Object  Pixabay      4.754902    0.958921   
3         I4  Alcohol 1   Object  Pixabay      4.685185    1.189111   
4         I5  Alcohol 2   Object  Pixabay      4.250000    1.136686   

   Valence_N  Arousal_mean  Arousal_SD  Arousal_N  
0        102      2.346535    1.602720        101  
1        102      2.227723    1.399151        101  
2        102      2.306931    1.514877        101  
3        108      2.865385    1.695555        104  
4        108      3.000000    1.700942        104  

df['Classification'] = ''

Я пытаюсь сначала закодировать каждую ячейку столбца «Классификация», как «Low_Valence», если она находится в списке из 200 самых маленьких строк «Valence_mean».

df.loc[df.Valence_mean in df.nsmallest(200, 'Valence_mean'), ['Classification']] = 'Low_Valence'

Я также пытался:

if df.Valence_mean.isin(df.nsmallest(200, 'Valence_mean')):
    df['Classification'] = 'Low_Valence'
if df.Valence_mean.isin(df.largest(200, 'Valence_mean')):
    df['Classification'] = 'Low_Valence'

Приведенные выше коды генерируют ошибку.Интересно, есть ли лучший способ сделать это?

Это решение работает, но мне интересно, есть ли что-то более элегантное:

small_Valence_df = df.nsmallest(200, 'Valence_mean')
high_Valence_df = df.nlargest(200, 'Valence_mean')
small_Valence_df['Classification'] = 'Low_Valence'
high_Valence_df['Classification'] = 'High_Valence'
frames = [small_Valence_df, high_Valence_df]
valence_df = pd.concat(frames)
valence_df.head()

1 Ответ

0 голосов
/ 23 марта 2019
df.loc[df.nsmallest(200,'Valence_mean').index.values,["Classification"]]="Low_valence"

Вы можете получить значения индекса и изменить значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...