Python AttributeError:只能将.str访问器与字符串值一起使用

时间:2019-12-02 13:38:42

标签: python pandas numpy

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!

3 个答案:

答案 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)将字符串转换为该列。