首页 > 解决方案 > 在某些值之间替换 df 中的值(将 >1 到 4 替换为 1)

问题描述

我想用另一个值替换 df 中的某些值阈值。例如,所有介于 1 和 <3.3 之间的值都应总结为 1。然后,所有介于 >=3.3 和 <10 之间的值都应总结为 2,依此类推。

我试过这样: tndf 是我的 df 和 tnn 列

tndf.loc[(tndf.tnn < 1), 'tnn'] = 0
tndf.loc[((tndf.tnn >= 1) | (tndf.tnn < 3.3)), 'tnn'] = 1
tndf.loc[((tndf.tnn >=3.3) | (tndf.tnn < 10)), 'tnn'] = 2
tndf.loc[((tndf.tnn >=10) | (tndf.tnn < 20)), 'tnn'] = 3
tndf.loc[((tndf.tnn >=20) | (tndf.tnn < 33.3)), 'tnn'] = 4
tndf.loc[((tndf.tnn >=33.3) | (tndf.tnn < 50)), 'tnn'] = 5
tndf.loc[((tndf.tnn >=50) | (tndf.tnn < 100)), 'tnn'] = 6
tndf.loc[(tndf.tnn == 100), 'tnn'] = 7

但是最后的每个值都将被总结为 6。我认为这就是为什么因为每个条件的第二部分。但我不知道如何告诉程序只查看特定范围(例如从 >=3.3 和 <10)。

标签: pythonpandasdataframepandas-loc

解决方案


要形成这样的类别,请使用pd.cut

pd.cut(df.tnn, [0, 1, 3.3, 10, 20, 33.3, 50, 100], right=False, labels=range(0, 7))

的样本输出pd.cut

         tnn cat
0  76.518227   6
1  44.808386   5
2  46.798994   5
3  70.798699   6
4  67.301112   6
5  13.701745   3
6  47.310570   5
7  74.048936   6
8  37.904632   5
9  38.617358   5

或者

使用np.select. 它完全适合您的用例。

conditions = [tndf.tnn < 1, (tndf.tnn >= 1) | (tndf.tnn < 3.3)]
values = [0, 1]
np.select(conditions, values, default="unknown")

推荐阅读