Hướng dẫn dùng pandas value_counts python

Tôi đã sử dụng gấu trúc df.value_counts () để tìm số lần xuất hiện của các thương hiệu cụ thể. Tôi muốn hợp nhất các giá trị đó với các nhãn hiệu tương ứng trong khung dữ liệu ban đầu.

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

 brand1   143
 brand2   21
 brand3   101
 etc.

Làm cách nào để hợp nhất số đếm giá trị với khung dữ liệu gốc sao cho số lượng tương ứng của mỗi thương hiệu nằm trong một cột mới, nói "brand_count"?

Có thể gán tiêu đề cho các cột này; Hàm tên sẽ không hoạt động với chuỗi và tôi không thể chuyển đổi nó thành một khung dữ liệu để có thể hợp nhất dữ liệu theo cách đó. Nhưng, value_counts đưa ra một loạt dtype int64 (tên thương hiệu phải là chuỗi kiểu) có nghĩa là tôi không thể làm như sau:

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

Cuối cùng, tôi muốn có được điều này:

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

đó là điều bạn muốn:

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)

Phần lớn đầu tiên của PS chỉ là một thế hệ dataframe.

Phần thú vị dành cho bạn bắt đầu bằng bình luận # generate 'brands' DF 

Bạn muốn sử dụng 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

Để tham khảo:

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

tôi nghĩ cách tốt nhất là sử dụng bản đồ

df['brand_count']= df.brand.map(df.brand.value_counts())

điều này nhanh hơn nhiều so với phương pháp nhóm chẳng hạn (hệ số 500 trên df 15000 hàng) và chỉ mất một dòng

df = ...
key_col = "brand"
count_col = "brand_count"

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

Nếu bạn cần tham gia đếm vào một khung dữ liệu khác, hãy nhớ điền NaNs bằng số không:

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})
)

Các thuộc tính hợp nhất và value_counts của Pandas DataFrame khá nhanh, vì vậy tôi sẽ kết hợp cả hai.

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

Tôi chỉ gặp phải vấn đề tương tự, vì vậy tôi cung cấp suy nghĩ của mình ở đây.

Cảnh báo

Khi bạn xử lý cấu trúc dữ liệu của Pandas, bạn phải biết về kiểu trả về .

Một giải pháp khác ở đây

Giống như @jezrael đã đề cập trước đây, Pandashãy cung cấp API pd.Series.to_frame.

Bước 1

Bạn cũng có thể hoàn thành pd.Seriesviệc pd.DataFramecần làm bằng cách

df_val_counts = pd.DataFrame(value_counts) # wrap pd.Series to pd.DataFrame

Sau đó, bạn có một pd.DataFramevới tên cột 'a'và cột đầu tiên của bạn trở thành chỉ mục

Input:  print(df_value_counts.index.values)
Output: [2 1]

Input:  print(df_value_counts.columns)
Output: Index(['a'], dtype='object')

Bước 2

Gì bây giờ?

Nếu bạn muốn thêm tên cột mới ở đây pd.DataFrame, bạn có thể chỉ cần đặt lại chỉ mục bằng API của reset_index () .

Và sau đó, thay đổi tên cột theo danh sách bằng API df.coloumns

df_value_counts = df_value_counts.reset_index()
df_value_counts.columns = ['unique_values', 'counts']

Sau đó, bạn có những gì bạn cần

Output:

       unique_values    counts
    0              2         3
    1              1         2

Câu trả lời đầy đủ tại đây

import pandas as pd

df = pd.DataFrame({'a':[1, 1, 2, 2, 2]})
value_counts = df['a'].value_counts(dropna=True, sort=True)

# solution here
df_val_counts = pd.DataFrame(value_counts)
df_value_counts_reset = df_val_counts.reset_index()
df_value_counts_reset.columns = ['unique_values', 'counts'] # change column names

17 hữu ích 0 bình luận chia sẻ