Чистый способ создания столбца на основе нескольких условий - PullRequest
0 голосов
/ 26 июня 2018

Мой вопрос прост - у меня есть следующая таблица:

+----------+-------+------------+--------+
| industry | class | occupation | value  |
+----------+-------+------------+--------+
|      170 |     4 |       1000 |  123.3 |
|      180 |     7 |       3600 | 4543.8 |
|      570 |     5 |        990 |  657.4 |
+----------+-------+------------+--------+

Я бы хотел создать новый столбец с именем "type". Значение этого столбца основано на этих нескольких условиях

  • Класс = 7: QWE
  • Класс = 8: ASD
  • Класс = 1 или 2: ZXC
  • Класс = 4, 5 или 6 И Промышленность = 170-490 или 570-690 И Профессия> = 1000: IOP
  • Класс = 4, 5 или 6 И Промышленность = 170-490 или 570-690 И Занятие между 10-3540: JKL
  • Все остальное: БНМ

Полученная таблица будет выглядеть так:

+----------+-------+------------+--------+------+
| industry | class | occupation | value  | type |
+----------+-------+------------+--------+------+
|      170 |     4 |       1000 |  123.3 | IOP  |
|      180 |     7 |       3600 | 4543.8 | QWE  |
|      570 |     5 |        990 |  657.4 | JKL  |
+----------+-------+------------+--------+------+

Мой первый подход к этому состоял в основном в создании нескольких фреймов данных каждого типа с использованием метода запроса к фрейму данных. Однако я узнал о методе «где», и в настоящее время я использую его вложенную версию для создания столбца «type» за один шаг. Тем не менее, я чувствую, что это не читается, и я могу представить себе ситуацию, когда есть еще больше условий, которые сделали бы этот процесс действительно грязным. Есть ли более чистый способ сделать это? Может быть со словарем или что-то?

1 Ответ

0 голосов
/ 26 июня 2018

Настройте свои условия и выходы и сохраните в списках:

a = df['class'].eq(7)  
b = df['class'].eq(8)  
c = df['class'].isin([1,2])    
helper = df['class'].isin([4,5,6]) & (df.industry.isin(range(170, 491)) | df.industry.isin(range(570, 691)))
d =  helper & df.occupation.ge(1000)
e = helper & df.occupation.isin(range(10, 3541))

conds = [a, b, c, d, e]
outs = ['QWE', 'ASD', 'ZXC', 'IOP', 'JKL']

Используйте np.select. Просто отметьте, что у вас есть перекрывающиеся условия, поэтому существует вероятность неоднозначности между IOP и JKL

df['out'] = np.select(conds, outs, default='BNM')

   industry  class  occupation   value  out
0       170      4        1000   123.3  IOP
1       180      7        3600  4543.8  QWE
2       570      5         990   657.4  JKL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...