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 倍
我正在 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 倍