在Python中将float转换为范围

时间:2016-02-06 16:02:13

标签: python-3.x pandas

我正在用熊猫做一些数据分析,我正在努力寻找一种很好的,简洁的方法来总结一系列数字。我有一个带浮动列的数据框,但是我对确切的数字不感兴趣,但是粗略的范围。最后,我想运行一个轴,并计算在一定范围内有多少个值。因此,理想情况下,我希望在数据框中创建一个新列,将我的浮点列转换为范围。说df [number] = 3.5,然后df [range] = 0-10

范围应为0-10,10-20,...> 100

这听起来很随意,但我一直在努力寻找答案。非常感谢

3 个答案:

答案 0 :(得分:1)

Pandas对此

具有cut功能
In [18]: s = pd.Series(np.random.uniform(0, 110, 100))

In [19]: s
Out[19]:
0     57.614427
1     30.576853
2     95.578943
3     53.010340
4     63.947381
        ...
95    42.252644
96    14.814418
97    81.271527
98     5.732966
99    90.932890


In [12]: s = pd.Series(np.random.uniform(0, 110, 100))

In [13]: s
Out[13]:
0      2.652461
1     46.536276
2      6.455352
3      6.075963
4     40.013378
        ...
95    39.775493
96    99.688307
97    41.064469
98    91.401904
99    60.580600
dtype: float64

In [14]: cuts = np.arange(0, 101, 10)

In [15]: pd.cut(s, cuts)
Out[15]:
0       (0, 10]
1      (40, 50]
2       (0, 10]
3       (0, 10]
4      (40, 50]
        ...
95     (30, 40]
96    (90, 100]
97     (40, 50]
98    (90, 100]
99     (60, 70]
dtype: category
Categories (10, object): [(0, 10] < (10, 20] < (20, 30] < (30, 40] ... (60, 70] < (70, 80] < (80, 90] <
                          (90, 100]]

请参阅docs以了解控制端点的情况。

请注意,在0.18(即将发布)中,结果将是IntervalIndex而不是Categorical,这将使事情变得更好。

要获得每个时间间隔的计数,请使用value_counts方法

In [17]: pd.cut(s, cuts).value_counts()
Out[17]:
(30, 40]     15
(40, 50]     13
(50, 60]     12
(60, 70]     10
(0, 10]      10
(90, 100]     8
(70, 80]      8
(80, 90]      7
(10, 20]      6
(20, 30]      3
dtype: int64

答案 1 :(得分:0)

def get_range_for(x, start=0, stop=100, step=10):
    if x < start:
        return (float('-inf'), start)
    if x >= stop:
        return (stop, float('inf'))
    left = step * ((x - start) // step)
    right = left + step
    return (left, right)

示例:

>>> get_range_for(3.5)
(0.0, 10.0)
>>> get_range_for(27.3)
(20.0, 30.0)
>>> get_range_for(75.6)
(70.0, 80.0)

转角案例:

>>> get_range_for(-100)
(-inf, 0)
>>> get_range_for(1234)
(100, inf)
>>> get_range_for(0)
(0, 10)
>>> get_range_for(10)
(10, 20)

答案 2 :(得分:0)

使用整数除法的属性应该有所帮助。因为您希望以10为单位的范围,将数字除以10(13.5 / 10 == 1.35),将其转换为整数(int(1.35) == 1),然后乘以10(1 * 10 == 10)将转换为数字到它所属范围的低端。这可能需要一些改进(特别是负数),但您可以尝试类似:

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({'vals': [3.5, 4.2, 10.5, 19.5, 20.3, 24.2]})
>>> df
   vals
0   3.5
1   4.2
2  10.5
3  19.5
4  20.3
5  24.2
>>> df['range_start'] = np.floor(df['vals'] / 10) * 10
>>> df
   vals  range_start
0   3.5            0
1   4.2            0
2  10.5           10
3  19.5           10
4  20.3           20
5  24.2           20