【问题标题】:How to create new values in a pandas dataframe column based on values from another column如何根据来自另一列的值在 pandas 数据框列中创建新值
【发布时间】:2018-03-14 19:16:05
【问题描述】:

我有一个从 csv 文件中读取的值的 pandas 数据框。我有一个标有“SleepQuality”的列,值在 0.0 到 100.0 之间浮动。我想创建一个标记为“SleepQualityGroup”的新列,其中原始列 btw 0 - 49 中的值在新列中的值为 0, 50 - 59 = 1 , 60 - 69 = 2, 70 - 79 = 3, 80 - 89 = 4,和 90 - 100 = 5

为了做到这一点,最好的公式是什么?我被困在识别每个范围内的所有值并分配给新值所需的逻辑上。

下面新的“SleepQualityGroup”列中的输出示例。

SleepQuality    SleepQualityGroup
80.4              4
90.1              5
66.4              2
50.3              1
86.2              4
75.4              3
45.7              0
91.5              5
61.3              2 
54                1
58.2              1

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    这基本上是一个分箱操作。因此这里可以使用两个工具。

    使用np.searchsorted -

    bins = np.arange(50,100,10)
    df['SleepQualityGroup'] = bins.searchsorted(df.SleepQuality)
    

    使用np.digitize -

    df['SleepQualityGroup'] = np.digitize(df.SleepQuality, bins)
    

    样本输出 -

    In [866]: df
    Out[866]: 
        SleepQuality  SleepQualityGroup
    0           80.4                  4
    1           90.1                  5
    2           66.4                  2
    3           50.3                  1
    4           86.2                  4
    5           75.4                  3
    6           45.7                  0
    7           91.5                  5
    8           61.3                  2
    9           54.0                  1
    10          58.2                  1
    

    运行时测试-

    In [921]: df
    Out[921]: 
        SleepQuality  SleepQualityGroup
    0           80.4                  4
    1           90.1                  5
    2           66.4                  2
    3           50.3                  1
    4           86.2                  4
    5           75.4                  3
    6           45.7                  0
    7           91.5                  5
    8           61.3                  2
    9           54.0                  1
    10          58.2                  1
    
    In [922]: df = pd.concat([df]*10000,axis=0)
    
    # @Dark's soln using pd.cut
    In [923]: %timeit df['new'] = pd.cut(df['SleepQuality'],bins=[0,50 , 60, 70 , 80 , 90,100], labels=[0,1,2,3,4,5])
    1000 loops, best of 3: 1.04 ms per loop
    
    In [926]: %timeit df['SleepQualityGroup'] = bins.searchsorted(df.SleepQuality)
    1000 loops, best of 3: 591 µs per loop
    
    In [927]: %timeit df['SleepQualityGroup'] = np.digitize(df.SleepQuality, bins)
    1000 loops, best of 3: 538 µs per loop
    

    【讨论】:

    • 你怎么这么快?
    • 他有技巧。
    【解决方案2】:

    使用pd.cut,即

    df['new'] = pd.cut(df['SleepQuality'],bins=[0,50 , 60, 70 , 80 , 90,100], labels=[0,1,2,3,4,5])
    

    输出:

    SleepQuality SleepQualityGroup 新 0 80.4 4 4 1 90.1 5 5 2 66.4 2 2 3 50.3 1 1 4 86.2 4 4 5 75.4 3 3 6 45.7 0 0 7 91.5 5 5 8 61.3 2 2 9 54.0 1 1 10 58.2 1 1

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2022-11-16
      • 2022-01-18
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多