我有一个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是浮动的,而其他的是字符串),但我找不到一种优雅的写作方式..
有什么想法吗?
答案 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