Pandas groupby: использование groupby для пометки элементов в их собственных группах - PullRequest
0 голосов
/ 13 октября 2018

Я новичок с py.Моя проблема в том, что мне не удалось сравнить элементы временной серии с их соответствующими группами по квантильной мере.Вот DF:

import numpy as np
import pandas as pd

#np.random.seed(444)

df = pd.DataFrame({
     'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo','foo','bar'],
     'B' : ['one', 'one', 'two', 'two','two', 'two', 'one', 'two','one','two'],
     '2018-09-28' : np.random.randn(10), 
     '2018-10-06' : np.random.randn(10),
     '2018-10-13' : np.random.randn(10)
})

df.index = ['se0','se1','se2','se3','se4','se5','se6','se7',"se8",'se9']
df.index.name = 'SE'

2 df затем создаются, где вычисляются верхний и нижний пределы

# вычисляют нижний и верхний квантиль в соответствии с группами A и B и помещают
это на уровне индекса (se0, ...)

df_low = df.groupby(['A','B']).transform(lambda x : x.quantile(0.45))
df_high = df.groupby(['A','B']).transform(lambda x : x.quantile(0.55))

print(df_low)
print(df_high)

# создать новый df, где есть флаг (1 или -1) в соответствии с тестом, оценивающим значение se0, ..., se9 против их группового квантиля

f=lambda x : -1 if x<df_low else 1 if x>df_high else 0
transformed=df.iloc[:,2:].apply(f)

и там у меня ошибка.Где я не прав?

1 Ответ

0 голосов
/ 13 октября 2018

при использовании x<df_low возвращает фрейм данных с логическим значением, в котором у вас есть True для значений в исходном df, которые больше, чем x.

Вот почему вы получаете ошибку, потому что оператор if ожидает True или False, но вместо этого получает фрейм данных.

Это должно дать вам фрейм данных, который вы ищете:

transformed = pd.DataFrame(0, index=df.iloc[:,2:].index, columns=df.iloc[:,2:].columns)
transformed[df.iloc[:,2:] < df_low] = -1
transformed[df.iloc[:,2:] > df_high] = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...