Как создать фрейм данных для двух условий в лямбда-функции, используя apply after groupby ()? - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь создать портфель ios в фреймах данных зависел от переменной 'scope', оставляя строки с наивысшими 33% значений области видимости в первом портфеле в фрейме данных, средние 34% во втором и нижнем 33% в третьем для каждого периода времени и отрасли.

До сих пор я группировал данные по дате и отрасли

group_first = data_clean.groupby(['date','industry'])

и впоследствии использовал лямбда-функцию для получения строк первый термин «область действия» для каждой даты и отрасли; например:

port = group_first.apply(lambda x: x[x['scope'] <= x.scope.quantile(0.33)]).reset_index(drop=True)

Это работает для первого и третьего терциля, но не для среднего, потому что я получаю

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

, помещая два условия в лямбда-функцию, как это :

group_middle = data_clean.groupby(['date','industry'])
port_middle = group_middle.apply(lambda x: (x[x['scope'] > x.scope.quantile(0.67)]) and (x[x['scope'] < x.scope.quantile(0.33)])).reset_index(drop=True)

Другими словами, как я могу получить строки кадра данных, содержащие значения в области видимости между 33-м и 67-м процентилем после группировки по дате и отрасли?

Любой идея как это решить?

1 Ответ

0 голосов
/ 18 апреля 2020

Я угадаю - у меня нет данных для проверки.

Вы используете неправильные < и >, и вы проверяете scope<33 and scope>67, который получает 0...33 and 67...100 (и может дать пустой данные), но вам нужно scope>33 and scope<67, чтобы получить 33..67

Вы также можете использовать x[ scope>33 & scope<67 ] вместо x[scope>33] and x[scope<67]

port_middle = group_middle.apply(lambda x: 
   x[ 
      (x['scope'] > x.scope.quantile(0.33)) & (x['scope'] < x.scope.quantile(0.67)
   ]
).reset_index(drop=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...