拆分字符串列并在Python中提取第二部分

时间:2019-03-18 06:11:03

标签: python pandas split extract

假设我有一个数据框,如下所示:

df = pd.DataFrame({"id": range(4), "price": ["15dollar/m2/day", "90dollar/m2/month", "18dollar/m2/day", "100dollar/m2/month"]})

       id               price
    0   0     15dollar/m2/day
    1   1   90dollar/m2/month
    2   2     18dollar/m2/day
    3   3  100dollar/m2/month

我想将列price分成两个新列:unit_priceprice_unit如下:

   id     unit_price  price_unit
0   0        15.0    dollar/m2/day
1   1        90.0    dollar/m2/month
2   2        18.0    dollar/m2/day
3   3       100.0    dollar/m2/month

这是我的解决方案:

df['unit_price'] = df['price'].str.split('dollar').str[0].astype(float)
#df['unit_price'] = df['price'].str.extract('(\d*\.\d+|\d+)', expand=False).astype(float)
df['price_unit'] = df['price'].str.split('dollar').str[1]
del df['price']

对于列unit_price来说,它工作正常,但是对于price_unit,当我除以dollar时,得到的结果如下,其中不包含字符dollar ,或者如果我使用df['price'].str.replace(r'\d', ''),则所有数字都将被删除。 如何在Python中正确执行?谢谢。

df['price_unit']
Out[474]: 
0      /m2/day
1    /m2/month
2      /m2/day
3    /m2/month
Name: price_unit, dtype: object 

2 个答案:

答案 0 :(得分:3)

您可以将Series.str.extract与正则表达式结合使用-^用于字符串开头,\d*\.\d+用于浮点数,\d+用于整数,然后对所有其他值使用{{1} }:

.*

第一个解决方案是按数字使用df = df.join(df.pop('price').str.extract('(?P<unit_price>^\d*\.\d+|^\d+)(?P<price_unit>.*)')) print (df) id unit_price price_unit 0 0 15 dollar/m2/day 1 1 90 dollar/m2/month 2 2 18 dollar/m2/day 3 3 100 dollar/m2/month extract

replace

答案 1 :(得分:0)

如果只是字符串,为什么不做简单处理,自己添加美元部分?

df['price_unit'] = 'dollar' + df['price'].str.split('dollar').str[1]

import pandas as pd

df = pd.DataFrame({"id": range(4), "price": ["15dollar/m2/day", "90dollar/m2/month", "18dollar/m2/day", "100dollar/m2/month"]})

df['unit_price'] = df['price'].str.split('dollar').str[0].astype(float)
df['price_unit'] = 'dollar' + df['price'].str.split('dollar').str[1]

del df['price']

print(df)

   id  unit_price       price_unit
0   0        15.0    dollar/m2/day
1   1        90.0  dollar/m2/month
2   2        18.0    dollar/m2/day
3   3       100.0  dollar/m2/month