Pandas类型转换和设置无效值为NA

5

如何将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的series,如果选择datetime,则预期结果为[123.0,nan,nan,1.3],仅当选择datetime时,series [2]才包含有效的datetime值。convert_objects不允许此类灵活性,我的看法。

2个回答

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_*函数。

我刚看到这个函数的签名:convert_objects(self, convert_dates=True, convert_numeric=False, convert_timedeltas=True, copy=True)。它不可能强制转换成特定的类型,对吧? - orange
浮点数、日期、增量……几乎总是需要这些(注意:整数不能有NaN)。 - Andy Hayden
在某些情况下,文件中可能包含我需要解释为字符串的整数。这种启发式方法行不通... - orange
@orange 你说:“将无效项设置为na”,这就是它的作用。如果你想更加挑剔,那么你可以使用一些掩码/条件手动设置为NaN(但我不知道你希望astype如何做到这一点:s) - Andy Hayden
@AndyHayden 我更新了我的问题以进一步明确我的要求。感谢你迄今为止的帮助(convert_objects 对我来说是新的,将来可能会有用)。 - orange
对于日期,您应该使用pd.to_datetime(带有coerce=True)。如果这个回答有帮助,请点赞。 - Andy Hayden

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

这并没有解决几个问题。astype函数将在值不是数字时引发错误。因此,如果第一行存在问题,则第二行和第三行将不会执行。而如果第一行没有问题,则第二行和第三行就无关紧要了。 - MB.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接