在python pandas中将高度(英尺和英寸)更改为整数

2024-10-01 15:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含高度信息的pandas数据帧,我似乎不知道如何将一些非结构化的信息转换为整数。在

我认为最好的方法是使用regex,但我遇到的主要问题是,当我试图简化使用regex的问题时,我通常会使用dataframe(7'5.5'')中的第一个项目,并尝试在其上专门使用regex。因为引号的缘故,我似乎不可能将这些数据放入字符串中。所以,我真的很困惑如何解决这个问题。在

这是我的数据帧:

    HeightNoShoes   HeightShoes
0   7' 5.5"             NaN
1   6' 11"           7' 0.25"
2   6' 7.75"            6' 9"
3   6' 5.5"          6' 6.75"
4   5' 11"           6' 0"

输出应以英寸为单位:

^{pr2}$

我的下一个选择是将此文件写入csv并使用excel,但我更愿意学习如何在python/pandas中实现它。任何帮助都将不胜感激。在


Tags: 数据项目方法字符串信息dataframepandas高度
2条回答

不使用regex的一种可能的方法是编写自己的函数并将其apply放入您选择的列/系列中。在

代码:

import pandas as pd

df = pd.read_csv("test.csv")
def parse_ht(ht):
    # format: 7' 0.0"
    ht_ = ht.split("' ")
    ft_ = float(ht_[0])
    in_ = float(ht_[1].replace("\"",""))
    return (12*ft_) + in_

print df["HeightNoShoes"].apply(lambda x:parse_ht(x))

输出:

^{pr2}$

虽然不太优雅,但它能做到这一点。最重要的是,它很容易调整和理解。在

与公认解决方案的比较:

In [9]: import re

In [10]: r = re.compile(r"([0-9]+)' ([0-9]*\.?[0-9]+)\"")
    ...: def get_inches2(el):
    ...:     m = r.match(el)
    ...:     if m == None:
    ...:         return float('NaN')
    ...:     else:
    ...:         return int(m.group(1))*12 + float(m.group(2))
    ...:     

In [11]: %timeit get_inches("7' 5.5\"")
100000 loops, best of 3: 3.51 µs per loop

In [12]: %timeit parse_ht("7' 5.5\"")
1000000 loops, best of 3: 1.24 µs per loop

parse_ht快了一倍多。在

前面对这个问题的回答是在不使用正则表达式的情况下很好地解决了这个问题。如果您想知道如何使用您的第一个想法(使用regex)来解决问题,我将发布此文章。在

使用正则表达式的方法可以解决这个问题。为了将您拥有的数据(例如7'5.5”)放入Python中的字符串中,可以转义引号。在

例如:

py_str = "7' 5.5\""

这与正则表达式相结合,将允许您从输入数据中提取计算输出数据所需的信息。输入数据由整数(英尺)后跟'、空格和浮点数(英寸)组成。此浮点由一个或多个数字组成,然后,可选地,a。还有更多的数字。下面是一个正则表达式,可以从输入数据中提取英尺和英寸:([0-9]+)' ([0-9]*\.?[0-9]+)"

第一组正则表达式检索英尺,第二组检索英寸。下面是python中的一个函数示例,该函数基于输入数据(如"7' 5.5\"")返回一个浮点值(以英寸为单位),如果没有有效匹配,则返回NaN:

代码:

^{pr2}$

示例:

>>> get_inches("7' 5.5\"")
89.5

可以将该正则表达式应用于数据中的元素。但是,将自己的函数映射到数据上的解决方案效果很好。我想你可能想看看如何利用你的原始想法来解决这个问题。在

相关问题 更多 >

    热门问题