如何基于另一列的值在pandas数据帧列中创建新值

2024-10-02 08:30:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从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

Tags: 文件csv数据标记示例pandas配方逻辑
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 new
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

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

使用^{}-

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

使用^{}-

^{pr2}$

样本输出-

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

相关问题 更多 >

    热门问题