如何将字符串 - 1year 6mon 转换为数字 1.5?
Posted
技术标签:
【中文标题】如何将字符串 - 1year 6mon 转换为数字 1.5?【英文标题】:How do I convert a string - 1year 6mon to an number 1.5? 【发布时间】:2019-09-03 21:15:46 【问题描述】:我有 2 列数据以 '1yrs 6mon' 格式存储,其中年份和月份值有多种排列。如何在 python 中将其转换为“总年数”或“总月数”?
我研究了如何做到这一点,但找不到任何建议
预期的输出可能如下所示 1yrs 6mon 可以是 1.5 年或 18 个月 0yrs 7mon 可以是 0.58 年或 7 个月
【问题讨论】:
【参考方案1】:您可以使用 pandas str.extractall
并进行一些预处理。
s = pd.Series(['1 yr 6 mon', '2 yr 5 mon'])
s
0 1 yr 6 mon
1 2 yr 5 mon
dtype: object
(s.str.extractall(r'(\d+)')[0]
.unstack()
.astype(int)
.set_axis(['yr', 'mon'], axis=1, inplace=False)
.eval('yr + mon / 12'))
0 1.500000
1 2.416667
dtype: float64
【讨论】:
感谢这一切顺利。我正在尝试使用 pandas split 但那会变成太多的代码行。【参考方案2】:另一种方法是在系列上使用findall
、Transform
和apply
到df
In [98]: df
Out[98]:
A B
0 1yr 6mon 0yr 7mon
1 3yrs 4mon 2yrs 5mons
定义一个自定义函数以在df
上与apply
一起使用。该函数使用findall
和Transform 来返回年份系列
def to_yrs(s):
return s.str.findall(r'(\d+)').transform(lambda x: int(x[0]) + int(x[1])/12)
In [99]: df.apply(to_yrs, axis=1)
Out[99]:
A B
0 1.500000 0.583333
1 3.333333 2.416667
【讨论】:
以上是关于如何将字符串 - 1year 6mon 转换为数字 1.5?的主要内容,如果未能解决你的问题,请参考以下文章