Повторяйте функцию бесконечно в столбце, пока значения не достигнут определенного уровня - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть этот фрейм данных:

  grade   type
0 402     A
1 312     B
2 321     C
...

Если тип A и значение в столбце оценок, если оно больше 100, я хочу бесконечно умножать его на 0,7, пока оно не достигнет значения ниже 100. Я не нашел хорошего способа сделать это, сейчас я Я использую этот код ниже:

df.loc[(df['type'] == 'A') & (df['grade'] > 100),'grade'] = df['grade']*0.7
(I repeat that 100 times and cross my fingers for 'grade' to be below 100)

Я мог бы просто сделать это несколько раз, и если бы он не достиг, я бы сделал 100, но я не хочу иметь много равных значений в df, а также я не могу поставить случайный компонент в нем.

Есть ли лучший способ сделать это (желательно с Пандами)?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Это должно работать:

for index, row in df.iterrows():
   if row['type'] == 'A':
       grade = row['grade']
       while grade > 100:
           grade = grade*.7
       df.loc[index, 'grade'] = grade
0 голосов
/ 28 апреля 2018

@ Предложение Псидома интересно, и оно, безусловно, работает, однако я хотел чего-то более простого, а также хотел избежать посещения Numpy. Используя предложение @ ykrueng в качестве вдохновения, я нашел способ запустить именно то, что хотел:

while len((df.loc[(df['type'] == 'A') & (df['grade'] > 100)]).index)>0:
    df.loc[(df['type'] == 'A') & (df['grade'] > 100),'grade'] = df['grade']*0.7
0 голосов
/ 28 апреля 2018

Вы можете рассчитать необходимую мощность, используя np.log (натуральный логарифм), с помощью которого вы можете дополнительно рассчитать множитель, необходимый для понижения значения до 100:

df.loc[df.type.eq('A') & df.grade.gt(100), 'grade'] = df.grade * np.power(0.7, np.floor(np.log(100 / df.grade) / np.log(0.7)) + 1)

df
#      grade type
#0   96.5202    A
#1  312.0000    B
#2  321.0000    C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...