#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
Таким образом, будет следовать приведенная ниже логика(все салареи являются ежегодными, в конечном счете, после того, как они будут очищены) :
- Когда столбец имеет отдельный номер, это означает, что зарплата уже представлена ежегодно и не требует никаких действий
- если на стороне зарплаты написано «за неделю», то умножьте эту зарплату на 52
- если на стороне зарплаты написано «за месяц», то умножьте эту зарплату на 12
- когда на стороне зарплаты написано «диапазон x-y», затем рассчитайте медиану диапазона, и это будет правильная зарплата
- если на зарплате сбоку написано «валюта XXX», например INR, рассчитайте зарплату, используя текущий курс конвертации этой валюты в фунт стерлингов(фунты стерлингов).
- Если зарплата имеет только код валюты, например «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. У вас было время протестировать код?