pandas `columns[summary.sort_values()> 0]`行为没有意义

62lalag4  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(88)

此问题来自Data Science Stack Exchange的migrated,因为它可以在Stack Overflow. Migrated上回答4天前。
isna()的结果如下:

data.isna().sum().sort_values()

个字符
我想做的是在一个列表中按值的升序获得列名,其中它们是非零的-所以在最后四个以上的情况下。所以本质上,我这样做了,但它给了我错误的结果:

>>> list(data.columns[data.isna().sum().sort_values() > 0])
['Lattitude', 'Longtitude', 'Regionname', 'Propertycount']


如果我不对它排序,它会像预期的那样工作:

>>> list(data.columns[data.isna().sum() > 0])  # no `.sort_values()`
['Car', 'BuildingArea', 'YearBuilt', 'CouncilArea']


但我想把名单整理一下
顺便说一句,这与isnull()的行为相同
我的问题是:
1.为什么会发生上述情况?为什么对结果进行排序会产生给予一些奇怪的输出(而且每次都是一样的--不管你运行多少次)
1.我怎样才能在列表中按升序获得列的名称?

4dc9hkyq

4dc9hkyq1#

list(data.columns[data.isna().sum().sort_values() > 0])

字符串
让我们来分解这个表达式:
data.isna().sum()将创建一个序列,其中列名作为索引,NaN的计数作为值。
应用sort_values()方法将根据NaN计数对上述序列进行排序,从而更改索引元素的顺序。更改索引元素的顺序将更改列名的顺序。
现在,当你使用排序序列过滤数据集的列时,就像在data.columns[data.isna().sum().sort_values() > 0]中一样,你本质上是用一个有排序索引的序列**索引未排序的data.columns。这就是你的表达式中出现意外行为的原因。
要解决这个问题,您需要首先对NaN count Series进行排序,然后从这个排序的Series中提取计数大于0的列名。您可以执行以下操作:

sorted_counts = data.isna().sum().sort_values()  # sorting the series
# extract column names from your sorted series
sorted_cols = sorted_counts[sorted_counts > 0].index.tolist()

相关问题