在给定以下约束的情况下,如何将某些数字连接到另一个数字?

时间:2017-02-20 20:39:13

标签: python regex python-3.x pandas

我正在将大熊猫数据框中的某些年份值标准化。

   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)进行标准化?

3 个答案:

答案 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)