首页 > 解决方案 > 拆分字符串列并在 Python 中提取第二部分

问题描述

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

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_price如下price_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']

对于 column unit_price,它工作正常,但是对于price_unit,当我拆分时dollar,我得到如下结果,其中不包括 character 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 

标签: pythonpandassplitextract

解决方案


您可以使用Series.str.extract正则表达式 -^用于字符串的开头,\d*\.\d+用于浮点数或\d+整数,然后用于所有其他值.*

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

第一个解决方案是使用extractandreplace数字:

pat = '(^\d*\.\d+|^\d+)'
df['unit_price'] = df['price'].str.extract(pat, expand=False)
df['price_unit'] = df.pop('price').str.replace(pat,'')
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

推荐阅读