首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将熊猫列中的一系列字符串转换为整数

如何将熊猫列中的一系列字符串转换为整数
EN

Stack Overflow用户
提问于 2017-08-10 11:41:29
回答 2查看 3.3K关注 0票数 2

我有一个熊猫的数据框架,在这个格式的"2016-05-03“中有一列关于日期的专栏,这些是字符串。我需要将它们转换为字符串中的int,并在连字符(‘-’)处拆分,并且只提取一年。

这就是我试图将字符串转换为整数的地方:

代码语言:javascript
复制
tyc.startDate = tyc.startDate.astype(np.int64) 

但它正在返回并出错:

ValueError: int()的文字无效,基数为10:'2015-06-01‘

这就是我为分裂所做的

代码语言:javascript
复制
tyc.startDate.str.split('-')[0]

代码语言:javascript
复制
tyc.startDate.str.split('-', [0]) 

但是这也不起作用,它分割并返回该列中所有行的列表:'2015','06','01‘,我只想拆分一年!

我确信有一种简单的方法,只需在0位置转换为int并拆分for ('-'),然后将其作为一个新列放到df中,请帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-10 13:09:42

我相信您的数据包含NaN或一些非datetime值:

代码语言:javascript
复制
tyc = pd.DataFrame({'startDate':['2016-05-03','2017-05-03', np.nan],
                    'col':[1,2,3]})
print (tyc)
   col   startDate
0    1  2016-05-03
1    2  2017-05-03
2    3         NaN

首先使用str[0]返回每一行的第一个列表值。但是也有问题--一些NaNs无法转换为int (be设计)--因此输出是浮动的:

代码语言:javascript
复制
print (tyc.startDate.str.split('-').str[0].astype(float))
0    2016.0
1    2017.0
2       NaN
Name: startDate, dtype: float64

另一种解决方案是通过to_datetime转换为日期时间,并通过year解析年份。

代码语言:javascript
复制
print (pd.to_datetime(tyc.startDate, errors='coerce'))
0   2016-05-03
1   2017-05-03
2          NaT
Name: startDate, dtype: datetime64[ns]

print (pd.to_datetime(tyc.startDate, errors='coerce').dt.year)
0    2016.0
1    2017.0
2       NaN
Name: startDate, dtype: float64

删除NaN的解决方案:

代码语言:javascript
复制
tyc['year'] = pd.to_datetime(tyc.startDate, errors='coerce').dt.year
print (tyc)
   col   startDate    year
0    1  2016-05-03  2016.0
1    2  2017-05-03  2017.0
2    3         NaN     NaN

1.

通过NaNs通过dropna删除所有行,然后强制转换为int:

代码语言:javascript
复制
tyc = tyc.dropna(subset=['year'])
tyc['year'] = tyc['year'].astype(int)
print (tyc)
   col   startDate  year
0    1  2016-05-03  2016
1    2  2017-05-03  2017

2.

NaN替换为诸如1这样的int值,替换为fillna,然后转换为int

代码语言:javascript
复制
tyc['year'] = tyc['year'].fillna(1).astype(int)
print (tyc)
   col   startDate  year
0    1  2016-05-03  2016
1    2  2017-05-03  2017
2    3         NaN     1
票数 1
EN

Stack Overflow用户

发布于 2017-08-10 11:45:10

您可以使用应用

代码语言:javascript
复制
def mod_strings(date_str):
    try:
        return int(date_str.split('-')[0])
    except (AttributeError, IndexError):  # in case value is not as 
                                          # expected returning original value
        return date_str

tyc.startDate = tyc.startDate.apply(mod_strings)

但是,简单地将整个列从字符串转换为date对象,然后使用tyc.startDate = tyc.startDate.dt.year (假设熊猫版本为>= 0.16),可能更容易一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45612770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档