在列中无限期重复功能,直到值达到一定水平

  • 本文关键字:水平 无限期 功能 python pandas
  • 更新时间 :
  • 英文 :


我有此dataframe:

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

如果类型为a,则等级列中的值,如果高于100,我想无限期地将其乘以0.7,直到达到100以下的值。我找不到这样做的好方法'm在下面使用此代码:

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中拥有很多相等的值,而且我也不能随机放置一个其中的组件。

有更好的方法可以做到这一点(最好是熊猫(?

您可以使用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

这应该有效:

for index, row in df.iterrows():
   if row['type'] == 'A':
       grade = row['grade']
       while grade > 100:
           grade = grade*.7
       df.loc[index, 'grade'] = grade

@psidom的建议很有趣,而且肯定有效,但是我想要一些简单的东西,而且我也想避免去做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

最新更新