【问题标题】:Map new column by range of values with pandas.series.between()使用 pandas.series.between() 按值范围映射新列
【发布时间】:2026-01-31 15:10:01
【问题描述】:

我正在尝试向我的 df 添加一个新列,该列将由同一 df 中其他列的范围映射。我正在使用pandas.series.between() 函数定义新值,但出现错误: TypeError: unhashable type: 'Series'

这是我尝试过的:

my_dict = {df['column'].between(0.0, 5.0) : 1,
                  df['column'].between(5.1, 7.0) : 2,
                  df['column'].between(7.1, 10.0) : 3,
                  df['column'].between(10.1, 13.0) : 4,
                  df['column'].between(13.1, 16.0) : 5,
                  df['column'].between(19.1, 22.0) : 6,
                  df['column'].between(22.1, 25.0) : 7,
                  df['column'].between(25.1, 28.0) : 8,
                  df['column'].between(28.1, 31.0) : 9,
                  df['column'].between(31.1, 34.0) : 10,
                  df['column'].between(34.1, 37.0) : 11,
                  df['column'].between(37.1, 40.0) : 12,
                  df['column'].between(40.1, df['column'].max()) : 13
                 }


df['new_column'] = df.map(my_dict)

如果在没有 s.bewtween() 的情况下还有其他方法可以做到这一点,那也是一个不错的选择。

【问题讨论】:

标签: python pandas dataframe dictionary range


【解决方案1】:

我们可以直接使用df.apply

def map_function(x):
   if 0.0<= x <=5        : return 1
   elif 5.1<=x<=7.0      : return 2
   elif 7.1<= x <=10.0   : return 3
   elif 10.1<= x <=13.0  : return 4
   elif 13.1<=x <= 16.0  : return 5
   elif 16.1<=x<=19.0    :return  6
   elif 19.1<=x<=22.0    :return  7
   elif 22.1<=x<=25.0    :return  8
   elif 25.1<=x<=28.0    :return  9
   elif 28.1<=x<=31.0    :return  10
   elif 31.1<=x<=34.0    :return  11
   elif 34.1<=x<=37.0    :return  12
   elif 37.1<= x <=40.0  :return  13
   elif x >40.0: return 14
df['new_column']=df['column'].apply(map_function)

注意:在您提到的范围中,您错过了一个括号 -(16-19)elif 16.1&lt;=x&lt;=19.0 :return 6 假设这是一个错误,我冒昧地添加了该范围。
如果故意错过范围(16-19),则对 map_function 进行相应的更改。

【讨论】: