Pandas减少了value_counts()列表中的分类变量数量

时间:2016-08-23 10:55:01

标签: python pandas categorical-data binning

Pandas新手我希望执行与Reduce number of levels for large categorical variables类似的操作(分类变量的分级以降低其级别) 以下代码在R

中正常工作
DTsetlvls <- function(x, newl)  
   setattr(x, "levels", c(setdiff(levels(x), newl), rep("other", length(newl))))

我的数据框:

df = pd.DataFrame({'Color': 'Red Red Blue'.split(),
                   'Value': [100, 150, 50]})

df['Counts'] = df.groupby('Color')['Value'].transform('count')
print (df)

  Color  Value  Counts
0   Red    100       2
1   Red    150       2
2  Blue     50       1

我手动创建聚合列,然后根据该列标记较不频繁的组,例如“蓝色”作为一个“其他”组。 但与简洁的R代码相比,这看起来很笨拙。这里的方法是什么?

1 个答案:

答案 0 :(得分:2)

我认为您可以将value_countsnumpy.where一起使用,其中条件为isin

df['new'] = np.where(df.Color.isin(vals), 0,1)
print (df)
    Color  Value  new
0     Red     11    0
1     Red    150    0
2    Blue     50    0
3     Red     30    0
4  Violet     10    1
5    Blue     40    0
df['new1'] = df.Color.where(df.Color.isin(vals), 'other')
print (df)
    Color  Value   new1
0     Red     11    Red
1     Red    150    Red
2    Blue     50   Blue
3     Red     30    Red
4  Violet     10  other
5    Blue     40   Blue

或者,如果需要替换所有非顶级值,请使用where

class AlphaTest(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Firefox()
            self.driver.implicitly_wait(30)
            self.driver.get("http://google.com/")

         def asserTrueId(self, value):
             self.assertTrue(self.driver.find_element_by_id(value))
             time.sleep(1)


         def test_flush_cache(self):
            self.asserTrueId("block-menu-menu-menu-for-directories")