2017-02-08 35 views
1

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

我想给每一行分配给其由限定的状态间隔。即

''' 
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)分机

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

所需的输出会是这样的:

 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

你是如何确定的状态?你只是看着平均值栏,看看它在哪个区间?如果是这样,我不明白你的例子?平均值是'0.158350',应该是's1'? – root

+0

嗨根。感谢您指出了这一点。它是一个错误。你的权利,它的意思是哪个区间。 – CiaranWelsh

回答

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