2015-09-15 26 views
10

Với khung dữ liệu Pandas có nhiều cột với giá trị phân loại (0 hoặc 1), bạn có thể thuận tiện nhận giá trị_giá trị cho mỗi cột cùng một lúc không?Làm thế nào để có được giá trị đếm cho nhiều cột cùng một lúc trong Pandas DataFrame?

Ví dụ, giả sử tôi tạo ra một DataFrame như sau:

import numpy as np 
import pandas as pd 
np.random.seed(0) 
df = pd.DataFrame(np.random.randint(0, 2, (10, 4)), columns=list('abcd')) 

tôi có thể có được một DataFrame như thế này:

a b c d 
0 0 1 1 0 
1 1 1 1 1 
2 1 1 1 0 
3 0 1 0 0 
4 0 0 0 1 
5 0 1 1 0 
6 0 1 1 1 
7 1 0 1 0 
8 1 0 1 1 
9 0 1 1 0 

Làm thế nào để thuận tiện lấy đếm giá trị cho mỗi cột và có được sau đây thuận tiện?

a b c d 
0 6 3 2 6 
1 4 7 8 4 

giải pháp hiện tại của tôi là:

pieces = [] 
for col in df.columns: 
    tmp_series = df[col].value_counts() 
    tmp_series.name = col 
    pieces.append(tmp_series) 
df_value_counts = pd.concat(pieces, axis=1) 

Nhưng có phải là một cách đơn giản, giống như xếp chồng, xoay vòng, hoặc groupby?

+0

[Câu trả lời dưới đây] (https://stackoverflow.com/a/47187144/3707607) cung cấp cách tiếp cận khác với 'pd.crosstab'. Ngoài ra, 'value_counts' là một hàm mức cao nhất và câu trả lời hiện được chọn có thể được đơn giản hóa thành' df.apply (pd.value_counts) ' –

Trả lời

22

Chỉ cần gọi apply và vượt qua pd.Series.value_counts:

In [212]: 
df = pd.DataFrame(np.random.randint(0, 2, (10, 4)), columns=list('abcd')) 
df.apply(pd.Series.value_counts) 

Out[212]: 
    a b c d 
0 4 6 4 3 
1 6 4 6 7 
+1

Làm thế nào tôi có thể không nghĩ về điều đó? Rực rỡ! – Xin

+0

Nếu các biến không nằm trong cùng phạm vi, các giá trị không tồn tại được hiển thị dưới dạng giá trị NaN (hiển nhiên). xem ra folks! – VishnuVardhanA

+0

có cách nào để sử dụng điều này cho một số cột được chọn không? – deadcode

3

Có thực sự là một cách khá thú vị và tiên tiến làm vấn đề này với crosstabmelt

df = pd.DataFrame({'a': ['table', 'chair', 'chair', 'lamp', 'bed'], 
        'b': ['lamp', 'candle', 'chair', 'lamp', 'bed'], 
        'c': ['mirror', 'mirror', 'mirror', 'mirror', 'mirror']}) 

df 

     a  b  c 
0 table lamp mirror 
1 chair candle mirror 
2 chair chair mirror 
3 lamp lamp mirror 
4 bed  bed mirror 

Đầu tiên chúng ta có thể làm tan DataFrame

df1 = df.melt() 
df1 

    columns index 
0  a table 
1  a chair 
2  a chair 
3  a lamp 
4  a  bed 
5  b lamp 
6  b candle 
7  b chair 
8  b lamp 
9  b  bed 
10  c mirror 
11  c mirror 
12  c mirror 
13  c mirror 
14  c mirror 

Và sau đó sử dụng chức năng crosstab để đếm các giá trị cho mỗi cột. Điều này bảo tồn các loại dữ liệu như ints đó sẽ không phải là trường hợp cho câu trả lời hiện đang được chọn:

pd.crosstab(index=df['index'], columns=df['columns']) 

columns a b c 
index   
bed  1 1 0 
candle 0 1 0 
chair 2 1 0 
lamp  1 2 0 
mirror 0 0 5 
table 1 0 0 

Hoặc trong một dòng, trong đó mở rộng các tên cột cho các tên tham số với ** (đây là nâng cao)

pd.crosstab(**df.melt(var_name='columns', value_name='index')) 

Ngoài ra, value_counts hiện là chức năng cấp cao nhất. Vì vậy, bạn có thể đơn giản hóa câu trả lời hiện được chọn thành:

df.apply(pd.value_counts) 
Các vấn đề liên quan