2017-02-08 2 views
1

У меня есть pandas.DataFrame, который выглядит следующим образом:Назначение набора данных в панд 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 в dataframe будет принадлежать к первому состояния (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

Как вы определения состояния? Вы просто смотрите на средний столбец и видите, в каком интервалах он находится? Если это так, я не получаю пример 's3'? Среднее значение «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 
Смежные вопросы