如何为基数高的列的某个阈值以上的水平创建虚拟?

时间:2019-05-18 20:28:10

标签: python-3.x pandas multiple-columns categorical-data dummy-variable

所以我的这一列具有很高的基数:

   Df['Education_Degree'].value_counts():

   Masters Degree in Mathematics                      5550
   Bachelors Degree in Physics                        4420
   Bacherlors Degree                                  3210
   Masters Degree in Mechanics                        2540
   Masters Degree                                     1200
   Masters Degree in Economics                        995
   .
   .
   .

   Name: Education_Degree, Length: 356, dtype: int64

我想做的是创建虚拟列,但仅适用于995以上的级别,任何建议将不胜感激,谢谢

2 个答案:

答案 0 :(得分:1)

以您的情况

s=Df['Education_Degree'].value_counts()
sdumm=pd.get_dummies(Df.loc[Df['Education_Degree'].isin(s.index[s>=995]),'Education_Degree'])

然后只concat

yourdf=pd.concat([Df,sdumm.reindex(Df.index).fillna(0)],axis=1)

答案 1 :(得分:0)

值计数提供了足够的信息来实现这一目标。

c=Df['Education_Degree'].value_counts()

这将返回Series对象。我们可以用它来创建假人。或者我们可以使用其他方式来获取价值计数:

c=Df.groupby('Education_Degree', sort=False)['Education_Degree'].count().sort_values(ascending=False)

结果将相同。

一旦有了系列对象,我们就可以创建虚拟对象。但是还有另一种解决方案。而是获取我们想要保留的列:

c=c[c>995]

我们可以获得不希望保留的列。

c=c[c<=995]
c_remove = c.index.tolist() # list of columns not to keep

通过这种方式,我们甚至都没有使用get_dummies()来调用它,

for i in range(0, len(Df)):
    c=Df.loc[i,'Education_Degree']
    Df.loc[i, c]=1

最后,我们将删除这些列:

Df.drop(c_remove, axis=1)