Python - 如果项目高于特定值则删除行,如果介于其他值之间则替换

Python - Remove row if item is above certain value and replace if between other values

我正在 pandas 数据框中工作,试图清理一些数据,我想为特定列分配多个规则。如果列值大于 500,我想删除该列。如果列值介于 101 和 500 之间,我想用 100 替换值。当列小于 101 return 列值。

我可以用 2 行代码完成它,但我很好奇是否有更简洁、更有效的方法来做到这一点。我尝试使用 If/Elif/Else,但我无法将其转换为 运行 或 lambda 函数,但我再次无法将其转换为 运行。

# This drops all rows that are greater than 500
df.drop(df[df.Percent > 500].index, inplace = True)

# This sets the upper limit on all values at 100
df['Percent'] = df['Percent'].clip(upper = 100)

您可以使用 .loc 和布尔掩码而不是 .drop() 和索引,并使用快速 numpy 函数 numpy.where() 来实现更高效/更好的性能,如下所示:

import numpy as np

df2 = df.loc[df['Percent'] <= 500]
df2['Percent'] = np.where(df2['Percent'] >= 101, 100, df2['Percent'])

性能比较:

第 1 部分:原始大小数据框

旧代码:

%%timeit
df.drop(df[df.Percent > 500].index, inplace = True)

# This sets the upper limit on all values at 100
df['Percent'] = df['Percent'].clip(upper = 100)

1.58 ms ± 56 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

新代码:

%%timeit
df2 = df.loc[df['Percent'] <= 500]
df2['Percent'] = np.where(df2['Percent'] >= 101, 100, df2['Percent'])

784 µs ± 8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

基准测试结果:

新代码需要 784 微秒,而旧代码需要 1.58 毫秒:

大约快 2 倍

第 2 部分:大型数据框

让我们使用原始大小的 10000 倍的数据框:

df9 = pd.concat([df] * 10000, ignore_index=True)

旧代码:

%%timeit
df9.drop(df9[df9.Percent > 500].index, inplace = True)

# This sets the upper limit on all values at 100
df9['Percent'] = df9['Percent'].clip(upper = 100)

3.87 ms ± 175 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

新代码:

%%timeit
df2 = df9.loc[df9['Percent'] <= 500]
df2['Percent'] = np.where(df2['Percent'] >= 101, 100, df2['Percent'])

1.96 ms ± 70.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

基准测试结果:

新代码需要 1.96 毫秒旧代码需要 3.87 毫秒 :

速度也提高了大约 2 倍