将pandas数据帧中的一组数据分配给一组状态(间隔)

时间:2017-02-08 19:13:53

标签: python pandas

我有一个pandas.DataFrame,如下所示:

        mean       std
0   0.123933  0.012185
1   0.119992  0.023833
2   0.119150  0.005884
4   0.107363  0.014191
8   0.123733  0.017090
12  0.155717  0.021808
18  0.337767  0.029997
24  0.742300  0.094091
30  1.087750  0.175827
36  1.517833  0.196728
42  1.181283  0.179431
48  1.936333  0.102685

我想将每一行分配给由interval定义的状态。即。

'''
Produce 11 numbers for 10 intervals between 0 and 2. 
i.e. first interval is between intervals[0] and intervals[1]
'''
intervals= numpy.linspace(0,2,11) 

>>>list(intervals)
[0.0,
 0.20000000000000001,
 0.40000000000000002,
 0.60000000000000009,
 0.80000000000000004,
 1.0,
 1.2000000000000002,
 1.4000000000000001,
 1.6000000000000001,
 1.8,
 2.0]

这些状态有标签,因此数据框中的index=0属于第一个状态(s1)ext。

在python中实现这个的最佳方法是什么?我目前正在查看numpy.histogram,但这会给出每个bin中的频率,而不是bin名称。

所需的输出类似于:

        mean       std    state
0   0.123933  0.012185    s1
1   0.119992  0.023833    s1
2   0.119150  0.005884    s1
4   0.107363  0.014191    s1
8   0.123733  0.017090    s1
12  0.155717  0.021808    s2
18  0.337767  0.029997    s2
24  0.742300  0.094091    s4
30  1.087750  0.175827    ...
36  1.517833  0.196728
42  1.181283  0.179431
48  1.936333  0.102685 

1 个答案:

答案 0 :(得分:2)

使用pd.cut

# Define the state labels.
labels = ['s{}'.format(i) for i in range(1, len(intervals))]

# Perform the cut.
df['state'] = pd.cut(df['mean'], bins=intervals, labels=labels)

您可能需要使用pd.cut的一些其他参数,具体取决于您的确切用例(例如,您希望包含的间隔的哪个端点等)。

结果输出:

        mean       std state
0   0.123933  0.012185    s1
1   0.119992  0.023833    s1
2   0.119150  0.005884    s1
4   0.107363  0.014191    s1
8   0.123733  0.017090    s1
12  0.155717  0.021808    s1
18  0.337767  0.029997    s2
24  0.742300  0.094091    s4
30  1.087750  0.175827    s6
36  1.517833  0.196728    s8
42  1.181283  0.179431    s6
48  1.936333  0.102685   s10