如何对包含字符串类型和np.nan的numpy数组进行排序

时间:2018-12-24 23:13:56

标签: python pandas numpy

我正在通过一个熊猫演示,我正在尝试将一串邮政编码的numpy数组排序为字符串,但是当我尝试np.ndarray.sort()时,该数组中有一个nan值给了我和错误

这是我正在关注的演示(在[48]中):http://nbviewer.jupyter.org/github/jvns/pandas-cookbook/blob/v0.2/cookbook/Chapter%207%20-%20Cleaning%20up%20messy%20data.ipynb

以下是示例值(这些值从实际演示示例中被截断了)

>>>print(unique_zips)
['11432' '11378' '10032' '10023' '10027' '11372' '11419' '11417' '10011'
 nan '10033' '11216' '10016' '10305' '10312' '10026' '10309' '10036']

这是错误

>>>print(unique_zips.sort())
TypeError: unorderable types: float() < str()

解决方法

我发现可以通过对列表进行如下排序来解决此问题:

unique_zips = requests['Incident Zip'].sort_values().unique()
print(unique_zips)

out:
['00083', ... '92123', nan]

但是如果我这样做,我会收到错误消息

unique_zips = requests['Incident Zip'].unique()
print(unique_zips.sort())

out:
TypeError: unorderable types: float() < str()

我检查了nan的类型,它是一个'float',解释了错误float()

我的解决方案是可以的,但是我想了解为什么numpy数组中的nan不能让我对数组进行排序。我不喜欢在调用unique()之前必须对值进行排序的方式。这可能会比较慢并且也不理想,因为我希望我的结果与我正在关注的演示相匹配。

排序numpy数组以处理nan时是否可以设置标志?

1 个答案:

答案 0 :(得分:0)

这应该根据数值对原始数组进行排序,并忽略numpy.nan

import numpy as np

arr = np.array(['11432', '11378', '10032', '10023', '10027', '11372', '11419', 
                '11417', '10011', np.nan, '10033', '11216', '10016', '10305', 
                '10312', '10026', '10309', '10036'])

arr = np.sort(arr[~np.isnan(arr.astype(float))])

这在熊猫列(Series)上也应该可以正常工作。

tilda(~)否定条件,并根据条件“不为真”进行过滤。但是,您首先不应该真正拥有混合类型的数组。为什么您大部分都是字符串和NaN? NumPy的矢量化功能都无法在这种阵列上工作。这个特定的过滤器之所以有效,是因为您的每个字符串都可以转换为float类型,作为混合数据的公分母。结果仍然是字符串类型。