我有一个简化的DataFrame,其中我想添加一个新的列Distance_km。在这个新列中,所有值都应该以公里为单位,并转换为float。
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我怎样才能得到这个输出?
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提前感谢!
发布于 2022-04-30 10:20:45
您可以使用Pandas 应用方法将您的距离列值传递给一个函数,该函数将其转换为如下所示的标准化单位
沿DataFrame的轴应用一个函数。 传递给函数的对象是Series对象,其索引要么是DataFrame的索引(axis=0),要么是DataFrame的列(axis=1)。默认情况下(result_type=None),最终返回类型是从应用函数的返回类型推断的。否则,它取决于result_type参数。
首先创建转换数据的函数,apply甚至可以接收lambda。
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)然后,您可以将此功能应用于您的距离列。
dist['Distanc_km'] = dist.apply(lambda row: convert_to_km(row['Distance']), axis=1)
dist输出将是
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发布于 2022-04-30 09:32:47
尝试:
# 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"]你会得到:
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,如果您的数据很大,这将是非常慢的。
发布于 2022-04-30 10:22:22
您也可以尝试如下:检查字符串的第二个最后一个字符是否为'k‘。
下面是使用apply到Distance列的实现:
dist['Distance_km'] = dist['Distance'].apply(lambda row: float(row[:-1])/1000 if not row[-2]=='k' else row[:-2])结果是:
Point Distance Distance_km
a 3km 3
b 400m 0.4
c 1.1km 1.1
d 200m 0.2https://stackoverflow.com/questions/72067189
复制相似问题