2017-10-26 6 views
1

私は仕事の給料を削ってしまった。データは、いくつかの形式(たとえば、1か月、1年、1日)です。私はすべてを1ヶ月に標準化したい。毎月の異なる給与タイプを毎月のパンダの列に変換する

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('-)にあると給与の平均を取ります。しかし、「1ヶ月」、「1年」、「1日」のようなテキストの存在は、私を引きつけています。この問題に近づくにはどうしたらいいですか?

答えて

2

あなたは、numericを得るためfindallまたはextractallを使用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 

EDIT:

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 
+0

はありがとうございました。私は何時間もここにこだわっていた。 –

+0

これは正しいですが、給与/日、年、月を考慮していません。 Jezraelはおそらくそれを非常にうまくやって乗数を加えて解決することができます。 :) +1 –

+0

@AntonvBR私はこれにどのようにアプローチすべきですか? 'df ['salary']にdf ['new'] * 12'がある場合、これは良いアプローチですか? –

関連する問題