2017-09-29 24 views
5

Tôi có khung dữ liệu này:Get tỷ lệ hàng (chuỗi) mà đáp ứng một điều kiện nhất định trong một khung dữ liệu gấu trúc

df = pd.DataFrame({"A": ["Used", "Not used", "Not used", "Not used", "Used", 
         "Not used", "Used", "Used", "Used", "Not used"], 
        "B": ["Used", "Used", "Used", "Not used", "Not used", 
         "Used", "Not used", "Not used", "Used", "Not used"]}) 

Tôi muốn tìm ra, cách sạch nhanh nhất để tìm hiểu những điều sau đây:

  • tỷ lệ hàng của tất cả các hàng đã sử dụng A.
  • tỷ lệ hàng của tất cả các hàng đã sử dụng B.
  • tỷ lệ hàng của tất cả các hàng t mũ đã sử dụng A và B.

Tôi mới dùng Python và gấu trúc (và mã hóa nói chung), vì vậy tôi chắc chắn điều này rất đơn giản, nhưng mọi hướng dẫn sẽ được đánh giá cao. Tôi đã cố gắng groupby(). Tổng hợp (tổng hợp) nhưng tôi đã không nhận được kết quả tôi cần (tôi sẽ tưởng tượng vì đây là những nhân vật chứ không phải là số nguyên.

Trả lời

8

Nếu cần tất cả các giá trị tỷ lệ sử dụng value_counts với normalize=True, cho nhiều cột groupby với size cho độ dài của tất cả các cặp và chia nó bằng cách length of df (giống như chiều dài của chỉ số):

print (100 * df['A'].value_counts(normalize=True)) 
Not used 50.0 
Used  50.0 
Name: A, dtype: float64 

print (100 * df['B'].value_counts(normalize=True)) 
Not used 50.0 
Used  50.0 
Name: B, dtype: float64 

print (100 * df.groupby(['A','B']).size()/len(df.index)) 
A   B  
Not used Not used 20.0 
      Used  30.0 
Used  Not used 30.0 
      Used  20.0 
dtype: float64 

Nếu giá trị cần lọc tạo mặt nạ và nhận mean-True s là qui ssed như 1 s:

print (100 * df['A'].eq('Used').mean()) 
#alternative 
#print (100 * (df['B'] == 'Used').mean()) 
50.0 

print (100 * df['B'].eq('Used').mean()) 
#alternative 
#print (100 * (df['B'] == 'Used').mean()) 
50.0 

print (100 * (df['A'].eq('Used') & df['B'].eq('Used')).mean()) 
20.0 
5

Sử dụng

1) Dùng Một

In [4929]: 100.*df.A.eq('Used').sum()/df.shape[0] 
Out[4929]: 50.0 

2) Dùng B

In [4930]: 100.*df.B.eq('Used').sum()/df.shape[0] 
Out[4930]: 50.0 

3) Được sử dụng A và B sử dụng

In [4931]: 100.*(df.B.eq('Used') & df.A.eq('Used')).sum()/df.shape[0] 
Out[4931]: 20.0 

1) là giống như

In [4933]: 100.*(df['A'] == 'Used').sum()/len(df.index) 
Out[4933]: 50.0 
Các vấn đề liên quan