【问题标题】:convert a column in a python pandas from STRING MONTH into INT将 python pandas 中的列从 STRING MONTH 转换为 INT
【发布时间】:2017-07-29 19:11:51
【问题描述】:

在 Python 2.7.11 和 Pandas 0.18.1 中:

如果我们有以下 csv 文件:

YEAR,MONTH,ID
2011,JAN,1
2011,FEB,1
2011,MAR,1

有没有办法将它作为 Pandas 数据框读取并将 MONTH 列转换为这样的字符串?

YEAR,MONTH,ID
2011,1,1
2011,2,1
2011,3,1

某些 pandas 函数,例如“dt.strftime('%b')”似乎不起作用。有人能解惑吗?

【问题讨论】:

    标签: python-2.7 pandas monthcalendar


    【解决方案1】:

    我想最简单也是最快的方法之一是创建一个映射字典和映射,如下所示:

    In [2]: df
    Out[2]:
       YEAR MONTH  ID
    0  2011   JAN   1
    1  2011   FEB   1
    2  2011   MAR   1
    
    In [3]: d = {'JAN':1, 'FEB':2, 'MAR':3, 'APR':4, }
    
    In [4]: df.MONTH = df.MONTH.map(d)
    
    In [5]: df
    Out[5]:
       YEAR  MONTH  ID
    0  2011      1   1
    1  2011      2   1
    2  2011      3   1
    

    如果不是所有 MONTH 值都为大写,您可能需要使用 df.MONTH = df.MONTH.str.upper().map(d)

    另一种更慢但更健壮的方法:

    In [11]: pd.to_datetime(df.MONTH, format='%b').dt.month
    Out[11]:
    0    1
    1    2
    2    3
    Name: MONTH, dtype: int64
    

    更新:我们可以自动创建映射 (thanks to @Quetzalcoatl)

    import calendar
    
    d = dict((v,k) for k,v in enumerate(calendar.month_abbr))
    

    或者(仅使用 Pandas):

    d = dict(zip(range(1,13), pd.date_range('2000-01-01', freq='M', periods=12).strftime('%b')))
    

    【讨论】:

    【解决方案2】:

    这是一个使用pandas API 和calendar.month_abbr 便利性的单行代码:

    from calendar import month_abbr
    
    lower_ma = [m.lower() for m in month_abbr]
    
    # one-liner with Pandas
    df['MONTH'] = df['MONTH'].str.lower().map(lambda m: lower_ma.index(m)).astype('Int8')
    
    1. 将标题大小写的calendar.month_abbr转换为小写
    2. 将降低外壳的MONTH 系列输入map 方法>> .str.lower()
    3. map方法中使用lambda函数,通过.indexpython列表方法获取对应月份缩写的索引>>.map(lambda m: lower_ma.index(m))
    4. 转换为整数>>.astype('Int8')

    【讨论】:

      【解决方案3】:

      跟随 Max 的最后一点;创建相同的东西,但依赖于本地数据框的月份编码方式:

      # create mapping
      d = dict((v,k) for k,v in zip(range(1, 13), df.Month.unique()))
      # create column
      df['month_index'] = df['Month'].map(d)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 2017-03-09
        • 2020-03-12
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        相关资源
        最近更新 更多