【问题标题】:Convert different salary types (per year, per month etc) to monthly in a pandas column在 pandas 列中将不同的工资类型(每年、每月等)转换为每月
【发布时间】:2017-10-26 05:46:14
【问题描述】:

我已经刮掉了一些工作的薪水。数据有几种格式(例如,每月、每年、每天)。我想将所有内容标准化为一个月。

jobs_df['salary']
7       7000 -  8000 a month
9       50000 - 80000 a year
5       80000 - 90000 a year
5       25000 - 28000 a year
4            450 - 600 a day
5               32925 a year
9               48300 a year

我的计划是jobs_df['salary'].str.split('-) 取平均工资。但是,诸如“一个月”、“一年”、“一天”之类的文字让我感到困惑。解决这个问题的 Python 方法是什么?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用findallextractall 获取numeric,转换为floats 最后获取mean

    jobs_df['new'] = pd.DataFrame(jobs_df['salary'].str.findall('(\d+)').values.tolist(),
                                  index=jobs_df.index).astype(float).mean(1)
    print (jobs_df)
                        salary      new
    0     7000 -  8000 a month   7500.0
    1     50000 - 80000 a year  65000.0
    2     80000 - 90000 a year  85000.0
    3     25000 - 28000 a year  26500.0
    4          450 - 600 a day    525.0
    5             32925 a year  32925.0
    6             48300 a year  48300.0
    

    或者:

    jobs_df['new'] = jobs_df['salary'].str.extractall('(\d+)')[0].unstack().astype(float).mean(1)
    print (jobs_df)
                        salary      new
    0     7000 -  8000 a month   7500.0
    1     50000 - 80000 a year  65000.0
    2     80000 - 90000 a year  85000.0
    3     25000 - 28000 a year  26500.0
    4          450 - 600 a day    525.0
    5             32925 a year  32925.0
    6             48300 a year  48300.0
    

    编辑:

    m1 = jobs_df['salary'].str.contains('month')
    m2 = jobs_df['salary'].str.contains('day')
    jobs_df['fin'] =np.select([m1, m2], 
                              [jobs_df['new'] * 12,jobs_df['new'] * 365], default=jobs_df['new'])
    print (jobs_df)
                        salary      new       fin
    0     7000 -  8000 a month   7500.0   90000.0
    1     50000 - 80000 a year  65000.0   65000.0
    2     80000 - 90000 a year  85000.0   85000.0
    3     25000 - 28000 a year  26500.0   26500.0
    4          450 - 600 a day    525.0  191625.0
    5             32925 a year  32925.0   32925.0
    6             48300 a year  48300.0   48300.0
    

    【讨论】:

    • 这是对的但不考虑薪水/日、年、月。 Jezrael 也可以通过添加乘数以非常好的方式解决这个问题。 :) +1
    • @AntonvBR 我应该如何处理这个问题? if 'month' in df['salary'] then df['new'] * 12这是个好方法吗?
    • @AntonvBR - 谢谢
    • @JamesSoh - 还需要多个 df['new'] * 365 几天?
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2021-02-13
    • 2018-08-19
    相关资源
    最近更新 更多