将字符串函数应用于可以为NaN的元素

时间:2015-11-02 23:19:46

标签: python string pandas

我有一个Pandas DataFrame,其中包含由人类编写的分类数据。我们这样说:

>>> df = pd.DataFrame({'name': ["A", " A", "A ", "b", "B"]})
  name
0    A
1    A
2   A
3    b
4    B

我想通过剥离空格并将它们大写来标准化这些值。这非常有效:

>>> df.apply(lambda x: x['name'].upper().strip(), axis=1)
0    A
1    A
2    A
3    B
4    B

我遇到的问题是我还有一些nan值,我实际上希望这些值在转换后保持为nan。但如果我有这个:

>>> df2 = pd.DataFrame({'name': ["A", " A", "A ", "b", "B", np.nan]})
>>> df2.apply(lambda x: x['name'].upper().strip(), axis=1)
("'float' object has no attribute 'upper'", u'occurred at index 5')

我想要的是:

0    A
1    A
2    A
3    B
4    B
5   NaN

我理解为什么会发生这种情况(nan是浮动的,而其他的是字符串),但我找不到一种优雅的写作方式..

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您可以使用向量化的str运算符:

>>> df2.name.str.strip().str.upper()
0      A
1      A
2      A
3      B
4      B
5    NaN
Name: name, dtype: object

答案 1 :(得分:1)

你可以在lambda函数中使用if语句来确保它是一个字符串:

>>> lambda x: x['name'].upper().strip() if isinstance(x, str) else x