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 NaN
s 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, Pandas
hãy cung cấp API pd.Series.to_frame
.
Bước 1
Bạn cũng có thể hoàn thành pd.Series
việc pd.DataFrame
cầ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.DataFrame
vớ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ẻ