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

Pandas convert types and set invalid values as na

提问人:orange 提问时间:9/5/2014 最后编辑:orange 更新时间:4/14/2017 访问量:2522

问:

是否可以将 pandas 系列值转换为特定类型并设置那些无法转换的元素 n/a?

我发现 with 和 set 以避免异常,但这不会将无效项目设置为 na...Series.astype(dtype, copy=True, raise_on_error=True)raise_on_error=True

更新

更准确地说,我想指定应将列转换为的类型。对于包含值和类型转换为 的系列,我希望结果,如果选择,则只有 将包含有效的日期时间值。 恕我直言,不允许这种灵活性。[123, 'abc', '2010-01-01', 1.3]float[123.0, nan, nan, 1.3]datetimeseries[2]convert_objects

蟒蛇 熊猫

评论


答:

6赞 Andy Hayden 9/5/2014 #1

我认为你可能会有更好的运气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 中,该方法已被弃用。
赞成pd.to_numeric
convert_objects

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

这并不像(也适用于 DataFrames)那样强大/神奇,但效果很好,在这种情况下更明确。
阅读文档的对象转换部分,其中提到了其他 to_* 函数。
convert_objects

评论

0赞 orange 9/5/2014
我刚刚看到了函数签名:.强制它转换为特定类型是不可能的,不是吗?convert_objects(self, convert_dates=True, convert_numeric=False, convert_timedeltas=True, copy=True)
0赞 Andy Hayden 9/5/2014
浮动、日期、三角洲......几乎总是你想要这些(注意:ints 不能有 NaN)。
0赞 orange 9/5/2014
在某些情况下,该文件将包含我需要解释为字符串的整数。这种启发式方法行不通......
0赞 Andy Hayden 9/6/2014
@orange你说:“将无效项目设置为 NA”,它就是这样做的。如果你想更挑剔,那么你可以使用一些掩码/条件手动设置为 NaN(但我不明白你期望 astype 如何做到这一点:s)
0赞 orange 9/7/2014
@AndyHayden 我已经更新了我的问题以完善我的要求。感谢您到目前为止的帮助(对我来说是新的,将来可能会有用)。convert_objects
-1赞 Eric Wang 11/21/2016 #2
s.astype(int, raise_on_error=False)
s = s.apply(lambda x: x if type(x)==int else np.nan)
s = s.dropna()

评论

0赞 MB. 1/12/2017
这并不能解决几个问题。如果值不是数字,astype 将引发错误。因此,如果第一行有问题,第二行和第三行将不会执行。如果第一行没有问题,那么第二行和第三行就无关紧要了。