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

use*_*665 9 python pandas

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

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

 brand1   143
 brand2   21
 brand3   101
 etc.
Run Code Online (Sandbox Code Playgroud)

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

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

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

最终,我想得到这个:

 col1  col2  col3  brands  brand_count ... col150
                   A        30
                   C        140
                   A        30
                   B        111 
Run Code Online (Sandbox Code Playgroud)

Max*_*axU 11

那是你要的吗:

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)
Run Code Online (Sandbox Code Playgroud)

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

对你感兴趣的部分从# generate 'brands'DF评论开始


Ale*_*der 7

你想用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
Run Code Online (Sandbox Code Playgroud)

以供参考:

>>> df.brands.value_counts()
brand3    4
brand5    2
brand4    1
brand0    1
brand1    1
brand2    1
Name: brands, dtype: int64
Run Code Online (Sandbox Code Playgroud)


小智 6

我认为最好的方法是使用地图

df['brand_count']= df.brand.map(df.brand.value_counts())
Run Code Online (Sandbox Code Playgroud)

例如,这比 groupby 方法快得多(15000 行 df 上的因子 500)并且只需要一行