我有此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