【问题标题】:Cleaning and Manipulating a column using pandas使用 pandas 清理和操作列
【发布时间】:2021-05-18 20:17:07
【问题描述】:

我的数据集中有以下列,数据按原样来自我的数据源:

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

现在我想创建一个应该如下所示的新列:

Salary_clean
2000
104007.8
240006
35000
964
0

所以下面的逻辑将遵循(所有的salareis最终都是每年一次):

  1. 当该列有一个独立的数字时,这意味着工资已经按年计算并且不需要任何操作
  2. 如果薪水旁边写着“每周”,则将该薪水乘以 52
  3. 如果薪水旁边写着“每月”,则将该薪水乘以 12
  4. 如果薪水旁边写着“x-y 范围”,则计算该范围的中位数,这就是正确的薪水
  5. 如果薪水旁边写着“XXX 货币”,如 INR,则使用该货币当前对 GBP(英镑)的兑换率计算薪水
  6. 如果salary只有“XXX”这样的货币代码,则将salary设为0

我怎样才能做到这一点?

【问题讨论】:

    标签: python-3.x pandas data-manipulation data-wrangling


    【解决方案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'^[^\W\d]*$': r'0'}
    
    df['Salary_clean'] = df['Salary'].replace(d, regex=True).apply(eval)
    
    >>> 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
    

    【讨论】:

    • @Django0602,对不起,糟糕的代码。希望这对您有所帮助!
    • 我会对此进行测试并告诉你。这实际上看起来不错,我确定不是最佳优化版本,但仍然可以完成任务。如果可行,将尝试并接受您的答案。 :)
    • @Django0602。你有时间测试代码吗?
    猜你喜欢
    • 2018-06-07
    • 2021-04-23
    • 1970-01-01
    • 2015-09-12
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多