如何用熊猫数据框中的范围替换列值

Posted

技术标签:

【中文标题】如何用熊猫数据框中的范围替换列值【英文标题】:how to replace column value with range in pandas dataframe 【发布时间】:2017-10-31 08:51:38 【问题描述】:

我有一个名为“df”的数据框,我想用另一列中的相应值替换数据框中一系列列中的值。

    6

    11

    16

    21

            age
    86508   12.0
    86509   6.0
    86510   7.0
    86511   8.0
    86512   10.0
    86513   15.0
    86514   15.0
    86515   16.0
    86516   20.0
    86517   23.0
    86518   23.0
    86519   7.0
    86520   18.0
    

结果是

            age    stage
    86508   12.0    2
    86509   6.0     1    
    86510   7.0     1
    86511   8.0     1
    86512   10.0    1
    86513   15.0    2
    86514   15.0    2
    86515   16.0    2
    86516   20.0    3
    86517   23.0    4
    86518   23.0    4
    86519   7.0     1
    86520   18.0    3

谢谢。

【问题讨论】:

【参考方案1】:

使用pd.cut():

In [37]: df['stage'] = pd.cut(df.age, bins=[0,11,16,21,300], labels=[1,2,3,4])

In [38]: df
Out[38]:
        age stage
86508  12.0     2
86509   6.0     1
86510   7.0     1
86511   8.0     1
86512  10.0     1
86513  15.0     2
86514  15.0     2
86515  16.0     2
86516  20.0     3
86517  23.0     4
86518  23.0     4
86519   7.0     1
86520  18.0     3

或more generic solution provided by @ayhan:

In [39]: df['stage'] = pd.cut(df.age, bins=[0, 11, 16, 21, np.inf], labels=False, right=True) + 1

In [40]: df
Out[40]:
        age  stage
86508  12.0      2
86509   6.0      1
86510   7.0      1
86511   8.0      1
86512  10.0      1
86513  15.0      2
86514  15.0      2
86515  16.0      2
86516  20.0      3
86517  23.0      4
86518  23.0      4
86519   7.0      1
86520  18.0      3

【讨论】:

不错!比使用条件语句要好得多。 很好的答案!对于这种情况,我总是忘记 pd.cut 。下次:) @谢谢你们! :-) pd.cut(df.age, bins=[0, 11, 16, 21, np.inf], labels=False, right=True) + 1 可能更通用(对于垃圾箱和标签)。【参考方案2】:

使用np.searchsorted

a = np.array([-np.inf, 6, 11, 16, 21, np.inf])
df.assign(stage=a.searchsorted(df.age, side='right') - 1)

        age  stage
86508  12.0      2
86509   6.0      1
86510   7.0      1
86511   8.0      1
86512  10.0      1
86513  15.0      2
86514  15.0      2
86515  16.0      3
86516  20.0      3
86517  23.0      4
86518  23.0      4
86519   7.0      1
86520  18.0      3

时机小数据

%%timeit
a = np.array([-np.inf, 6, 11, 16, 21, np.inf])
df.assign(stage=a.searchsorted(df.age, side='right') - 1)
1000 loops, best of 3: 288 µs per loop

%%timeit
df.assign(stage=pd.cut(df.age, bins=[0,11,16,21,300], labels=[1,2,3,4]))
1000 loops, best of 3: 668 µs per loop

【讨论】:

更新我的实用功能包:) +1

以上是关于如何用熊猫数据框中的范围替换列值的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫数据框中使用正则表达式替换列值

如何将逗号添加到数据框中的现有值中?熊猫

如何为熊猫数据框中的每一行映射/替换列中的多个值

列值不在熊猫数据框中的索引中

如何用熊猫(python)中的其他值替换NAN [重复]

将列值分配给熊猫数据框中的唯一行[重复]