首页 > 解决方案 > Pandas Dataframe 的 Clean 方法将每行中的最低 n 值设置为零

问题描述

我想转换 Pandas Dataframe 的值,以便例如将 3 个最小列设置为零:

row1: 0.21, 0.11, 0.24, 0.52, 0.12
row2: 0.31, 0.01, 0.44, 0.52, 0.52

会成为:

row1: 0.0, 0.0, 0.24, 0.52, 0.0
row2: 0.0, 0.0. 0.0, 0.52, 0.52

我宁愿这样做没有一些循环。

标签: pythonpandasdataframe

解决方案


我们可以使用where+ rankon axis=1rank和将在行内建立排序method='min'ascending=False使得最小值为 1,最大值为 5(行的总长度)。然后我们where用 rank 替换所有小于 3 的值:

df = df.where(df.rank(axis=1, method='min', ascending=False) < 3, 0)

我们还可以使用相反的条件 withmask来保留排名高于 3 的值,并将 3 或更低的值替换为 0:

df = df.mask(df.rank(axis=1, method='min', ascending=False) >= 3, 0)

任一选项都会产生df

     0    1     2     3     4
0  0.0  0.0  0.24  0.52  0.00
1  0.0  0.0  0.00  0.52  0.52

*注意取决于我们可能还想要的期望行为,method='dense'或者method='first'这将改变在排名中处理重复值的方式。


设置:

import pandas as pd

df = pd.DataFrame({
    0: [0.21, 0.31],
    1: [0.11, 0.01],
    2: [0.24, 0.44],
    3: [0.52, 0.52],
    4: [0.12, 0.52]
})

推荐阅读