2017-02-20 51 views
1

我正在熊貓數據框內的一些年份值正常化。如何在給定以下約束的情況下將某些數字連接到另一個數字?

years 

0 2011 
1 2012 
2 2050 
3 11 
4 23 
5 01 
.... 
n 2015 

正如你所看到的,有些值是錯誤的,因爲它們必須是4位數。因此,我想將它們轉換成四位數字:

year 

0 2011 
1 2012 
2 2050 
3 2011 
4 2023 
5 2001 
    ... 
n 2015 

針對以上情況,在previous question我瞭解到,您可以使用函數代替完成這個任務:

df['years'].replace('\b\d{2}\b.*?', r'20\2', regex=True) 

我有試過不同的正則表達式:

^[0-9]{2} 
^[0-9]{2}.* 
(\d\d)* 
^(\d{2}) 
r'\b\d{2}\b' 

但是,這些不起作用。因此,如何使用四位數字(添加20)對上述數據幀進行標準化?

+1

「年份」列的dtype是什麼? – MaxU

+0

@MaxU'year object dtype:object' – tumbleweed

回答

4
df.years = pd.to_numeric(df.years, errors='coerce') 

In [12]: df 
Out[12]: 
    years 
0 2011 
1 2012 
2 2050 
3  11 
4  23 
5  1 
6 2015 

In [13]: df.loc[df.years <= 50, 'years'] += 2000 

In [14]: df 
Out[14]: 
    years 
0 2011 
1 2012 
2 2050 
3 2011 
4 2023 
5 2001 
6 2015 

UPDATE:轉換爲字符串:

In [35]: df 
Out[35]: 
    years 
0 2011.0 
1 2012.0 
2 2050.0 
3 2011.0 
4 2023.0 
5 2001.0 
6  NaN 
7 2015.0 

In [36]: df.dtypes 
Out[36]: 
years float64 
dtype: object 

In [37]: df.years.where(df.years.notnull(), '') 
Out[37]: 
0 2011 
1 2012 
2 2050 
3 2011 
4 2023 
5 2001 
6 
7 2015 
Name: years, dtype: object 
+0

我的號碼變成了花車:'2019.0' – tumbleweed

+1

這是最直接,最棒的! – miradulo

+1

@Mitch,謝謝! – MaxU

1
df['years'].astype(int).apply(lambda year: 2000 + year if year < 2000 else year).astype(str) 
1

如果多年不已經是一個字符串,你可以把它轉換:

df['years'] = df['years'].astype(str) 

現在你可以找到具有「短年」值的條目,即年份少於四個字符的條目。它保存到布爾的系列索引到數據幀:

short_years = df['years'].str.len() < 4 

最後修改值是4個字符長:

df.loc[short_years, 'years'] = df[short_years]['years'].map(lambda yr: '2{:03d}'.format(int(yr))) 

這種使用在地圖拉姆達的假設所有的值在幾年內可以轉換爲int。如果不是這種情況,您可能需要定義一個函數:

def atoi(s): 
    """Convert string to integer, if possible, otherwise return None.""" 
    try: 
     return int(s) 
    except ValueError: 
     return None 

df.loc[short_years, 'years'] = df[short_years]['years'].map(atoi) 
+0

謝謝湯姆的幫助 – tumbleweed

相關問題