我有这个数据框:
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)?
答案 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