2014-04-21 37 views
9

Tôi có dataframe với nhiều cột (≈30) từ nguồn bên ngoài (tệp csv) nhưng một số giá trị không có giá trị hoặc luôn giống nhau. Vì vậy, tôi sẽ thấy nhanh chóng value_counts cho mỗi cột, làm thế nào tôi có thể làm điều đó?Giá trị pandas được áp dụng cho mỗi cột

Ví dụ

Id, temp, name 
1 34, null, mark 
2 22, null, mark 
3 34, null, mark 

Would return tôi một đối tượng nói rằng

  • Mã sản phẩm: 34 -> 2, 22 -> 1
  • tạm thời: null -> 3
  • tên : mark -> 3

Vì vậy, tôi biết rằng nhiệt độ là tên không thích hợp và không phải là thú vị (luôn luôn giống nhau)

+0

Vòng qua các cột và in một 'value_counts' cho mỗi ? – joris

+0

@joris nói gì. Có một [vấn đề] (https://github.com/pydata/pandas/pull/5381) Để thêm phương thức 'value_counts' vào DataFrame, nhưng có một vài vấn đề cần làm với căn chỉnh chỉ mục. – TomAugspurger

Trả lời

9

Đối với dataframe,

df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

đoạn mã sau

for c in df.columns: 
    print "---- %s ---" % c 
    print df[c].value_counts() 

sẽ tạo ra kết quả sau:

---- id --- 
34 2 
22 1 
dtype: int64 
---- temp --- 
null 3 
dtype: int64 
---- name --- 
mark 3 
dtype: int64 
+0

Cảm ơn nhận xét và câu trả lời của bạn. Tôi nghĩ rằng nó có thể làm điều đó mà không có một vòng lặp nhưng có vẻ như nó không phải là. (Và yep tôi đã nhìn thấy vấn đề được đề cập, hy vọng nó sẽ có thể sớm :)). – Edouard

+0

Trên thực tế, tại sao không làm điều đó với một bản đồ như: bản đồ (lambda x: x.value_counts(), mdf.columns) – Edouard

3

bạn có thể sử dụng df.apply sẽ áp dụng từng cột có chức năng được cung cấp, trong trường hợp này thiếu giá trị. Đây là những gì nó trông giống như,

df.apply(lambda x: x.isnull().value_counts())

1

Một cách tốt đẹp để làm điều này và trả về một loạt độc đáo Formatter là kết hợp pandas.Series.value_countspandas.DataFrame.stack.

Đối với DataFrame

df = pandas.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

Bạn có thể làm một cái gì đó giống như

df.apply(lambda x: x.value_counts()).T.stack() 

Trong mã này, df.apply(lambda x: x.value_counts()) áp dụng value_counts để mỗi cột và gắn nó vào kết quả DataFrame, vì vậy bạn kết thúc với một DataFrame với cùng các cột và một hàng cho mỗi giá trị khác nhau trong mỗi cột (và rất nhiều null cho mỗi giá trị không xuất hiện trong mỗi cột).

Sau đó, T transposes các DataFrame (do đó bạn kết thúc với một DataFrame với một chỉ số tương đương với các cột và các cột tương ứng với giá trị có thể), và stack biến các cột của DataFrame vào một cấp độ mới của MultiIndex và "xóa" tất cả các giá trị Null, làm cho toàn bộ điều là Series.

Kết quả của việc này là

id 22  1 
     34  2 
temp null 3 
name mark 3 
dtype: float64 
0

Mã như sau

df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=["id", 'temp', 'name'], index=[1, 2, 3]) 
result2 = df.apply(pd.value_counts) 
result2 

sẽ sản xuất:

enter image description here

Các vấn đề liên quan