将python pandas中的一列从STRING MONTH转换为INT

时间:2017-03-09 00:28:53

标签: python-2.7 pandas monthcalendar

在Python 2.7.11&熊猫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')"似乎不起作用。有人可以开导吗?

3 个答案:

答案 0 :(得分:4)

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

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

如果并非所有df.MONTH = df.MONTH.str.upper().map(d)值都是大写的话,您可能希望使用MONTH

另一种更慢但更强大的方法:

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')))

答案 1 :(得分:1)

以下是使用 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. lambda方法中使用map函数,通过.index python list方法获取对应月份缩写的索引>> .map(lambda m: lower_ma.index(m))
  4. 转换为整数 >> .astype('Int8')

答案 2 :(得分:0)

跟随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)