2016-06-10 2 views
1

Возьмите dataframe с одной колонке воображаемых данных «температурой»:Вычисление процентиля на панд dataframe и присвоение двоичного значения нового столбец

import pandas as pd 
import numpy as np 

dates = pd.date_range('20070101',periods=3200) 
df = pd.DataFrame(data=np.random.randint(0,100,(3200,1)), columns =list('A')) 
df['date'] = dates 
df = df[['date','A']] 

Я хочу, чтобы назначить все строки со значениями ниже 10-го процентиля и выше 90-й процентиль с -1 и 1 соответственно (при остальном 0).

Вот функция, чтобы попытаться сделать это:

temp = [] 
def quantilecalc(x): 
    for season in df: 
     if season > df.quantile(.9): 
      temp.append(1) 
     if season < df.quantile(.1): 
      temp.append(-1) 
     else: 
      temp.append(0) 

Когда я применяю этот quantilecalc(df) я получаю следующее сообщение об ошибке:

File "C:\\\\lib\site-packages\pandas\core\ops.py", line 682, in na_op 
raise TypeError("invalid type comparison") 

TypeError: invalid type comparison 

Я пытался применить его к определенному колонку из dataframe quantilecalc(df['A']), но это дает ту же ошибку. Будет действительно оценить некоторый опыт ...

+1

Ну, для начала 'для сезона в df:' итерации по столбцам в вашем df, а не строки, также вы можете использовать 3 маски для установки всех строк, которые отвечают критериям вместо цикла – EdChum

+0

Извинения, мои навыки python aren ' Отличный. Я не знаю о масках, вы говорите, что я могу изменить это, чтобы перебирать строки, и это сработает? Если да - как мне это сделать? – Pad

+1

в основном вы можете сделать что-то вроде 'df.loc [df ['A']> df ['A']. Quanteil (0.9), 'A'] = 1' и т. Д. – EdChum

ответ

3

@EdChum при условии, этот ответ:

создать новый столбец df['temp'] = "" и применил:

df.loc[df['A'] > df['A'].quantile(0.9), 'temp'] = 1 
df.loc[df['A'] < df['A'].quantile(0.1), 'temp'] = -1 

Спасибо!

Смежные вопросы