Pandas转换类型并将无效值设为na

5 投票
2 回答
2585 浏览
提问于 2025-04-19 23:26

有没有办法把 pandas 的系列(Series)里的值转换成特定的类型,并把那些不能转换的元素设置为 n/a 呢?

我发现了一个方法 Series.astype(dtype, copy=True, raise_on_error=True),把 raise_on_error=True 设置上可以避免出现错误,但这样并不会把无效的项设置为 na...

更新

更具体来说,我想指定某一列应该转换成什么类型。比如说,如果一个系列包含值 [123, 'abc', '2010-01-01', 1.3],我想把它转换成 float 类型,那么我希望得到的结果是 [123.0, nan, nan, 1.3]。如果选择 datetime 类型,只有 series[2] 会包含一个有效的日期时间值。在我看来,convert_objects 并不允许这种灵活的操作。

2 个回答

-1

这段代码是用来做某些操作的,但具体的功能需要根据上下文来理解。一般来说,代码块里包含了一些指令或者逻辑,用来处理数据或者实现某种功能。

如果你看到类似的代码,通常它们会有变量、函数或者条件判断等元素。变量就像是一个盒子,用来存放信息;函数是一个可以重复使用的代码块,执行特定的任务;而条件判断则是根据不同的情况来决定执行哪段代码。

总之,理解代码的关键在于弄清楚每一部分的作用,以及它们是如何协同工作的。这样,你就能更好地掌握编程的基本概念了。

s.astype(int, raise_on_error=False)
s = s.apply(lambda x: x if type(x)==int else np.nan)
s = s.dropna()
6

我觉得你可以试试 convert_objects,可能会更顺利:

In [11]: s = pd.Series(['1', '2', 'a'])

In [12]: s.astype(int, raise_on_error=False)  # just returns s
Out[12]:
0    1
1    2
2    a
dtype: object

In [13]: s.convert_objects(convert_numeric=True)
Out[13]:
0     1
1     2
2   NaN
dtype: float64

更新:在最近的pandas版本中,convert_objects这个方法已经被淘汰了。
现在推荐使用 pd.to_numeric

In [21]: pd.to_numeric(s, errors='coerce')
Out[21]:
0    1.0
1    2.0
2    NaN
dtype: float64

这个方法的功能没有 convert_objects 那么强大(后者也可以在数据框上使用),但在这种情况下效果很好,而且更明确。
你可以查看文档中的 对象转换部分,那里提到了其他的 to_* 函数。

撰写回答