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

use*_*984 7 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
Run Code Online (Sandbox Code Playgroud)

我想通过剥离空格和大写它们来规范化这些值.这非常有效:

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

我遇到的问题是我也有一些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')
Run Code Online (Sandbox Code Playgroud)

我想要的是这个:

0    A
1    A
2    A
3    B
4    B
5   NaN
Run Code Online (Sandbox Code Playgroud)

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

有什么想法吗?

Ale*_*der 4

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

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