2013-02-28 38 views
5

Tôi có một tập hợp các dữ liệu từ mà tôi muốn âm mưu số các phím mỗi id duy nhất đếm (x = unique_id_count, y = key_count), và tôi cố gắng tìm hiểu cách tận dụng lợi thế của pandas.Lô đếm chính mỗi đếm giá trị duy nhất trong gấu trúc

Trong trường hợp này:

unique_ids 1 = count chìa khóa 2

unique_ids 2 = chìa khóa số 1

from pandas import * 
key_items = ("a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "c", "c", "c") 
id_data = ("X", "X", "X", "X", "X", "X", "X", "Y", "Y", "Y", "X", "X", "X") 

df = DataFrame({'keys': key_items, 'ids': id_data}) 

tôi đã quản lý để mangle dữ liệu vào những gì tôi muốn bằng cách kéo ra dữ liệu từ khung dữ liệu và tái cơ cấu nó và xây dựng lại một khung dữ liệu mới. Trong trường hợp này có thể là tốt hơn để làm tất cả trong python mà không gấu trúc ...

unique_values = defaultdict(list) 
for items in df.itertuples(index=False): 
    key = items[1] 
    v = items[0] 
    unique_values[key].append(v) 

unique_values_count = {} 
for k, values in unique_values.iteritems(): 
    unique_values_count[k] = [len(set(values))] 

# reformat for plotting 
key_col = ("a", "b", "c") 
id_col = [unique_values_count[k][0] for k in key_col] 



df2 = DataFrame({"keys":key_col, "unique_id_count": id_col}) 
df2.groupby("unique_id_count").size().plot(kind="bar") 

Có cách nào tốt hơn để làm điều này trực tiếp hơn bằng cách sử dụng dataframe ban đầu?

Trả lời

9
s = df.groupby("keys").ids.agg(lambda x:len(x.unique())) 
pd.value_counts(s).plot(kind="bar") 
+1

Điều này có thể được đơn giản hóa một chút: 's' có thể được tính mà không cần sử dụng lambdas gấu trúc 'nunique' chức năng như vậy:' s = df.groupby ("phím"). agg (Series.nunique) ' – mjul

4

Làm thế nào về chỉ trực tiếp sử dụng value_counts()

pd.value_counts(df['ids']).plot.bar() 

enter image description here

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