首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大熊猫DataFrame中m转换为km,字符串转换为浮动

大熊猫DataFrame中m转换为km,字符串转换为浮动
EN

Stack Overflow用户
提问于 2022-04-30 09:21:21
回答 3查看 232关注 0票数 0

我有一个简化的DataFrame,其中我想添加一个新的列Distance_km。在这个新列中,所有值都应该以公里为单位,并转换为float。

代码语言:javascript
复制
d = {'Point': ['a','b','c','d'], 'Distance': ['3km', '400m','1.1km','200m']}
dist=pd.DataFrame(data=d)
dist
    
  Point Distance
0   a    3km
1   b    400m
2   c    1.1km
3   d    200m

Point       object
Distance    object
dtype: object

我怎样才能得到这个输出?

代码语言:javascript
复制
    Point   Distance    Distance_km
0    a       3.8km          3.8
1    b       400m           0.4
2    c       1.1km          1.1
3    d       200m           0.2

Point           object
Distance        object
Distance_km    float64
dtype: object

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-30 10:20:45

您可以使用Pandas 应用方法将您的距离列值传递给一个函数,该函数将其转换为如下所示的标准化单位

从文件中

沿DataFrame的轴应用一个函数。 传递给函数的对象是Series对象,其索引要么是DataFrame的索引(axis=0),要么是DataFrame的列(axis=1)。默认情况下(result_type=None),最终返回类型是从应用函数的返回类型推断的。否则,它取决于result_type参数。

首先创建转换数据的函数,apply甚至可以接收lambda。

代码语言:javascript
复制
import re

def convert_to_km(distance):
    '''
    distance can be a string with km or m as units
    e.g. 300km, 1.1km, 200m, 4.5m
    '''
    
    # split the string into value and unit ['300', 'km']
    split_dist = re.match('([\d\.]+)?([a-zA-Z]+)', distance)
    
    value = split_dist.group(1) # 300
    unit = split_dist.group(2)  # km
    
    if unit == 'km':
        return float(value)
    if unit == 'm':
        return round(float(value)/1000, 2)
   
d = {'Point': ['a','b','c','d'], 'Distance': ['3km', '400m','1.1km','200m']}
dist=pd.DataFrame(data=d)

然后,您可以将此功能应用于您的距离列。

代码语言:javascript
复制
dist['Distanc_km'] = dist.apply(lambda row: convert_to_km(row['Distance']), axis=1)

dist

输出将是

代码语言:javascript
复制
    Point   Distance    Distanc_km
0   a            3km    3.0
1   b           400m    0.4
2   c          1.1km    1.1
3   d           200m    0.2
票数 0
EN

Stack Overflow用户

发布于 2022-04-30 09:32:47

尝试:

代码语言:javascript
复制
# An "Weight" column marking those are in "m" units    
dist["Weight"] = 1e-3
dist.loc[dist["Distance"].str.contains("km"),"Weight"] = 1

# Extract the numeric part of string and convert it to float
dist["NumericPart"] = dist["Distance"].str.extract("([0-9.]+)\w+").astype(float)

# Merge the numeric parts with their units(weights) by multiplication
dist["Distance_km"] = dist["NumericPart"] * dist["Weight"]

你会得到:

代码语言:javascript
复制
  Point Distance  Weight  NumericPart  Distance_km
0     a      3km   1.000          3.0          3.0
1     b     400m   0.001        400.0          0.4
2     c    1.1km   1.000          1.1          1.1
3     d     200m   0.001        200.0          0.2

顺便说一句:如果可能的话,避免使用apply,如果您的数据很大,这将是非常慢的。

票数 0
EN

Stack Overflow用户

发布于 2022-04-30 10:22:22

您也可以尝试如下:检查字符串的第二个最后一个字符是否为'k‘。

  • 如果只删除最后两个字符,即“km”
  • 否则,取最后一个字符(即“m”),并将浮点数除以1000。

下面是使用applyDistance列的实现:

代码语言:javascript
复制
dist['Distance_km'] = dist['Distance'].apply(lambda row: float(row[:-1])/1000 if not row[-2]=='k' else row[:-2])

结果是:

代码语言:javascript
复制
    Point   Distance    Distance_km
       a    3km          3
       b    400m         0.4
       c    1.1km        1.1
       d    200m         0.2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72067189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档