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