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

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

  1. 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

谢谢。

【问题讨论】:

    标签: python pandas dataframe range conditional-statements


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2023-03-12
    • 2022-01-11
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多