我正在将大熊猫数据框中的某些年份值标准化。
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
)进行标准化?
答案 0 :(得分: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
更新:转换为字符串:
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
答案 1 :(得分:1)
df['years'].astype(int).apply(lambda year: 2000 + year if year < 2000 else year).astype(str)
答案 2 :(得分:1)
如果年份不是字符串,您可以转换它:
df['years'] = df['years'].astype(str)
现在您可以找到具有“短年”值的条目,即年份少于四个字符。将其保存到一系列bool中以索引数据框:
short_years = df['years'].str.len() < 4
最后将值修改为四个字符:
df.loc[short_years, 'years'] = df[short_years]['years'].map(lambda yr: '2{:03d}'.format(int(yr)))
在map中使用lambda假设年中的所有值都可以转换为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)