从任意数据帧开始,我想返回一个仅包含具有多个不同值的列的数据帧。
我有:
X = df.nunique()
喜欢:
Id 5
MSSubClass 3
MSZoning 1
LotFrontage 5
LotArea 5
Street 1
Alley 0
LotShape 2
然后我将其从系列转换为数据框:
X = X.to_frame(name = 'dcount')
然后我使用where子句仅返回值> 1:
X.where(X[['dcount']]>1)
如下所示:
dcount
Id 5.0
MSSubClass 3.0
MSZoning NaN
LotFrontage 5.0
LotArea 5.0
Street NaN
Alley NaN
LotShape 2.0
...
但是我现在只想要那些没有dcount ='NaN'的column_names(在X的索引中),这样我最终可以回到我的原始数据帧df并将其定义为:
df=df[[list_of_columns]]
该如何完成?我尝试了很多方法,这是PitA。我怀疑有一种方法可以用1或2行代码来实现。
答案 0 :(得分:3)
您可以使用布尔索引,避免将计数系列转换为数据框:
counts = df.nunique()
df = df[counts[counts > 1].index]
关键是要注意您的counts
系列的 index 是列标签。因此,您可以过滤序列,然后通过pd.Series.index
提取所需的索引。
这是一个示范:
df = pd.DataFrame({'A': [1, 1, 1], 'B': [1, 2, 3],
'C': [4, 5, 5], 'D': [0, 0, 0]})
counts = df.nunique()
df = df[counts[counts > 1].index]
print(df)
B C
0 1 4
1 2 5
2 3 5