flights['Duration']=flights['Duration'].str.replace('h','*60').str.replace(' ','+').str.replace('m','*1').apply(eval)
但是我收到此错误消息:
AttributeError Traceback (most recent call last)
<ipython-input-24-45eafc3e9d23> in <module>()
----> 1 travel['Duration']=travel['Duration'].str.replace('h','*60').str.replace(' ','+').str.replace('m','*1').apply(eval)
2
3 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/strings.py in _validate(data)
1965
1966 if inferred_dtype not in allowed_types:
-> 1967 raise AttributeError("Can only use .str accessor with string " "values!")
1968 return inferred_dtype
1969
AttributeError: Can only use .str accessor with string values!
答案 0 :(得分:0)
看起来您的排行['Duration']列没有字符串值(可能是int64或float64)。
import pandas as pd
df = pd.DataFrame(data=[(1, '12h 50m'), (2, '1h 12m')], columns=['id', 'Duration'])
df['Duration']=df['Duration'].str.replace('h','*60').str.replace(' ','+').str.replace('m','*1').apply(eval)
结果:
id Duration
0 1 770
1 2 72
这很好用,因为当我们创建数据框时-第二列的值是字符串类型。如果我们的基本数据不一致,那么我们应该谨慎对待结果,这可能会产生误导。示例:
df = pd.DataFrame(data=[(1, 123), (2, 0.123), (3, '12h 30m')], columns=['id', 'Duration'])
df['Duration']=df['Duration'].astype(str).str.replace('h','*60').str.replace(' ','+').str.replace('m','*1').apply(eval)
结果:
id Duration
0 1 123.000
1 2 0.123
2 3 750.000
在此示例中,我们使用了.astype(str),但正如我们看到的,如果数据具有各种数据类型-结果可能确实是错误的。因此,请检查数据源中的数据框,然后再次尝试转换数据:)
答案 1 :(得分:0)
您可能想做的更像是:
flights['Duration'] = pd.to_timedelta(flights['Duration']).seconds//60
它将直接将时间字符串转换为分钟
您尝试与apply(eval)
一起使用的方法。 。 。 very unsafe.
答案 2 :(得分:-1)
您应该首先使用 astype(str)将字符串转换为该列。