首页 文章

如何将pandas value_counts()合并到dataframe或使用它来对数据帧进行子集化

提问于
浏览
6

我使用pandas df.value_counts()来查找特定品牌的出现次数 . 我想将这些 Value 计数与初始数据框中的相应品牌合并 .

df has many columns including one named 'brands'
 brands = df.brands.value_counts()

 brand1   143
 brand2   21
 brand3   101
 etc.

如何将值计数与原始数据框合并,使每个品牌的相应计数位于新列中,例如“brand_count”?

是否可以为这些列分配 Headers ;名称函数不适用于系列,我无法将其转换为数据帧,可能以这种方式合并数据 . 但是,value_counts输出一系列dtype int64(品牌名称应为type string),这意味着我无法执行以下操作:

df2 = pd.DataFrame({'brands': list(brands_all[0]), "brand_count":
 list(brands_all[1])})
 (merge with df)

最终,我想得到这个:

col1  col2  col3  brands  brand_count ... col150
                   A        30
                   C        140
                   A        30
                   B        111

4 回答

  • 1

    那是你要的吗:

    import numpy as np
    import pandas as pd
    
    # generating random DataFrame
    brands_list = ['brand{}'.format(i) for i in range(10)]
    a = pd.DataFrame({'brands': np.random.choice(brands_list, 100)})
    b = pd.DataFrame(np.random.randint(0,10,size=(100, 3)), columns=list('ABC'))
    df = pd.concat([a, b], axis=1)
    print(df.head())
    
    # generate 'brands' DF
    brands = pd.DataFrame(df.brands.value_counts().reset_index())
    brands.columns = ['brands', 'count']
    print(brands)
    
    # merge 'df' & 'brands_count'
    merged = pd.merge(df, brands, on='brands')
    print(merged)
    

    PS的第一个重要部分就是数据帧生成 .

    有趣的部分以 # generate 'brands' DF评论开头

  • 6
    df = ...
    key_col = "brand"
    count_col = "brand_count"
    
    result = (
        df.join(
            df[key_col].value_counts().rename(count_col), 
            how="left", 
            on=key_col)
    )
    

    如果您需要将计数加入到不同的数据帧,请记住用零填充 NaN

    df = ...
    other = ...
    key_col = "brand"
    count_col = "brand_count"
    
    result = (
        other.join(
            df[key_col].value_counts().rename(count_col), 
            how="left", 
            on=key_col)
        .fillna({count_col: 0})
    )
    
  • 11

    你想使用 transform .

    import numpy as np
    import pandas as pd
    
    np.random.seed(0)
    
    # Create dummy data.
    df = pd.DataFrame({'brands': ['brand{0}'.format(n) 
                       for n in np.random.random_integers(0, 5, 10)]})
    
    df['brand_count'] = \
        df.groupby('brands', as_index=False)['brands'].transform(lambda s: s.count())
    
    >>> df
       brands brand_count
    0  brand4           1
    1  brand5           2
    2  brand0           1
    3  brand3           4
    4  brand3           4
    5  brand3           4
    6  brand1           1
    7  brand3           4
    8  brand5           2
    9  brand2           1
    

    以供参考:

    >>> df.brands.value_counts()
    brand3    4
    brand5    2
    brand4    1
    brand0    1
    brand1    1
    brand2    1
    Name: brands, dtype: int64
    
  • 0

    Pandas DataFrame的merge和value_counts属性非常快,所以我将两者结合起来 .

    df.merge(df['brand'].value_counts().to_frame(), how='left', left_on='brand',
             right_index=True, suffixes=('', 'x'))\
      .rename(columns={'brandx':'brand_count'})
    

相关问题