在列中无限重复功能,直到值达到特定级别

时间:2018-04-27 22:42:09

标签: python pandas

我有这个数据框:

  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中有很多相同的值,而且我可以&# 39;在其中加入随机成分。

有没有更好的方法(最好是Pandas)?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

这应该有效:

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

答案 2 :(得分:0)

@ 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