2017-02-08 36 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