Очистка и управление колонной с помощью панд

#python-3.x #pandas #data-manipulation #data-wrangling

Вопрос:

У меня в наборе данных есть следующий столбец, данные поступают как есть из моего источника данных:

 Salary
~£2000
~£2000.15 per week
~£2000.50 per month
~£2000 - ~£5000 range
100000INR
INR
 

Теперь я хочу создать новую колонку, которая должна выглядеть так :

 Salary_clean
2000
104007.8
240006
35000
964
0
 

Таким образом, будет следовать приведенная ниже логика(все салареи являются ежегодными, в конечном счете, после того, как они будут очищены) :

  1. Когда столбец имеет отдельный номер, это означает, что зарплата уже представлена ежегодно и не требует никаких действий
  2. если на стороне зарплаты написано «за неделю», то умножьте эту зарплату на 52
  3. если на стороне зарплаты написано «за месяц», то умножьте эту зарплату на 12
  4. когда на стороне зарплаты написано «диапазон x-y», затем рассчитайте медиану диапазона, и это будет правильная зарплата
  5. если на зарплате сбоку написано «валюта XXX», например INR, рассчитайте зарплату, используя текущий курс конвертации этой валюты в фунт стерлингов(фунты стерлингов).
  6. Если зарплата имеет только код валюты, например «XXX», то ставьте зарплату как 0

Как я могу этого достичь?

Ответ №1:

Отказ от ответственности: этот код может быть опасным ( eval функция используется без каких-либо предосторожностей). Кроме того, код полностью оптимизирован, но имеет то преимущество, что он компактен.

 d = {r'~[^d] ': r'',
     r'per week': r'* 52',
     r'per month': r'* 12',
     r'(.*) - (.*) range': r'(1   2) / 2',
     r'dINR': r' * 0.0096',
     r'^[^Wd]*

 >>> df
                  Salary  Salary_clean
0                 ~£2000        2000.0
1     ~£2000.15 per week      104007.8
2    ~£2000.50 per month       24006.0
3  ~£2000 - ~£5000 range        3500.0
4              100000INR          96.0
5                    INR           0.0
 

Результат replace метода:

 >>> df['Salary'].replace(d, regex=True)

0                 2000
1         2000.15 * 52
2         2000.50 * 12
3    (2000   5000) / 2
4       10000 * 0.0096
5                    0
Name: Salary, dtype: object
 

Комментарии:

1. @Django0602, Извините за ужасный код. Надеюсь, это вам все равно поможет!

2. Я проверю это и дам вам знать. Это выглядит хорошо на самом деле, я уверен, что это не лучшая оптимизированная версия, но все равно выполняет задачу.. Попробую и приму ваш ответ, если это сработает. :)

3. @Django0602. У вас было время протестировать код?

: r'0'}

df['Salary_clean'] = df['Salary'].replace(d, regex=True).apply(eval)


Результат replace метода:


Комментарии:

1. @Django0602, Извините за ужасный код. Надеюсь, это вам все равно поможет!

2. Я проверю это и дам вам знать. Это выглядит хорошо на самом деле, я уверен, что это не лучшая оптимизированная версия, но все равно выполняет задачу.. Попробую и приму ваш ответ, если это сработает. 🙂

3. @Django0602. У вас было время протестировать код?