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