假设我有一个数据框,如下所示:
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']
对于列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
答案 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