将 python pandas 中的列从 STRING MONTH 转换为 INT
convert a column in a python pandas from STRING MONTH into INT
在 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')" 似乎不起作用。有人可以启发吗?
我想最简单也是最快的方法之一是创建一个映射字典和映射,如下所示:
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
更新: 我们可以自动创建映射 ()
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')))
按照 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)
这是使用 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')
- 将首字母大写的
calendar.month_abbr
转换为小写
- 将小写的
MONTH
系列提供给 map
方法 >> .str.lower()
- 在
map
方法中使用lambda
函数,通过.index
python列表方法获取相应月份缩写的索引 >> .map(lambda m: lower_ma.index(m))
- 转换为整数 >>
.astype('Int8')
在 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')" 似乎不起作用。有人可以启发吗?
我想最简单也是最快的方法之一是创建一个映射字典和映射,如下所示:
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
更新: 我们可以自动创建映射 (
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')))
按照 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)
这是使用 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')
- 将首字母大写的
calendar.month_abbr
转换为小写 - 将小写的
MONTH
系列提供给map
方法 >>.str.lower()
- 在
map
方法中使用lambda
函数,通过.index
python列表方法获取相应月份缩写的索引 >>.map(lambda m: lower_ma.index(m))
- 转换为整数 >>
.astype('Int8')