2013-02-21 41 views
11

Giả sử tôi có một DataFrame của tạo như thế này:Rẽ Pandas DataFrame các chuỗi vào histogram

import pandas as pd 
s1 = pd.Series(['a', 'b', 'a', 'c', 'a', 'b']) 
s2 = pd.Series(['a', 'f', 'a', 'd', 'a', 'f', 'f']) 
d = pd.DataFrame({'s1': s1, 's2', s2}) 

Có khá nhiều thưa thớt trong các chuỗi trong các dữ liệu thực tế. Tôi muốn tạo biểu đồ về sự xuất hiện của các chuỗi trông giống như những gì được tạo ra bởi d.hist() (ví dụ: với subplots) cho s1 và s2 (một cho mỗi subplot).

Chỉ cần làm d.hist() cho lỗi này:

/Library/Python/2.7/site-packages/pandas/tools/plotting.pyc in hist_frame(data, column, by, grid, xlabelsize, xrot, ylabelsize, yrot, ax, sharex, sharey, **kwds) 
    1725   ax.xaxis.set_visible(True) 
    1726   ax.yaxis.set_visible(True) 
-> 1727   ax.hist(data[col].dropna().values, **kwds) 
    1728   ax.set_title(col) 
    1729   ax.grid(grid) 

/Library/Python/2.7/site-packages/matplotlib/axes.pyc in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs) 
    8099    # this will automatically overwrite bins, 
    8100    # so that each histogram uses the same bins 
-> 8101    m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs) 
    8102    if mlast is None: 
    8103     mlast = np.zeros(len(bins)-1, m.dtype) 

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/function_base.pyc in histogram(a, bins, range, normed, weights, density) 
    167    else: 
    168     range = (a.min(), a.max()) 
--> 169   mn, mx = [mi+0.0 for mi in range] 
    170   if mn == mx: 
    171    mn -= 0.5 

TypeError: cannot concatenate 'str' and 'float' objects 

Tôi cho rằng tôi có thể tự đi qua từng loạt, làm một value_counts(), sau đó âm mưu nó như là một âm mưu thanh, và tự tạo ra các ô phụ. Tôi muốn kiểm tra xem có cách nào đơn giản hơn không.

Trả lời

1

Tôi sẽ chuyển Series thành collections.Counter (documentation) (Bạn có thể cần chuyển đổi nó thành danh sách trước). Tôi không phải là chuyên gia pandas, nhưng tôi nghĩ bạn có thể gấp đối tượng Counter trở lại thành một Series, được lập chỉ mục bởi các chuỗi và sử dụng để tạo các ô của bạn.

Điều này không làm việc vì nó (đúng) tăng lỗi khi cố gắng đoán vị trí cạnh của thùng, điều này đơn giản là không có ý nghĩa với chuỗi.

+0

ag, đánh bại tôi! có, truy cập là công cụ cho công việc! –

+1

Cảm ơn bạn đã phản hồi. value_counts làm điều tương tự, và là một loạt -> Series chuyển đổi (vì vậy không cần phải ép buộc nó trở lại vào một Series). Tôi đoán tôi đã tự hỏi nếu có một số tùy chọn để làm điều này đếm và âm mưu cho tôi tự động cho trường hợp cụ thể của dây, bởi vì có một cho ints. – amatsukawa

6

Bạn có thể sử dụng pd.value_counts (value_counts cũng là một phương pháp series):

In [20]: d.apply(pd.value_counts) 
Out[20]: 
    s1 s2 
a 3 3 
b 2 NaN 
c 1 NaN 
d NaN 1 
f NaN 3 

và hơn cốt truyện DataFrame kết quả.

19

Tái tạo dataframe:

import pandas as pd 
s1 = pd.Series(['a', 'b', 'a', 'c', 'a', 'b']) 
s2 = pd.Series(['a', 'f', 'a', 'd', 'a', 'f', 'f']) 
d = pd.DataFrame({'s1': s1, 's2': s2}) 

Để có được biểu đồ với ô phụ như mong muốn:

d.apply(pd.value_counts).plot(kind='bar', subplots=True) 

enter image description here

Các OP đề cập pd.value_counts trong câu hỏi. Tôi nghĩ rằng phần còn thiếu chỉ là không có lý do để "bằng tay" tạo cốt truyện thanh mong muốn.

Kết quả từ d.apply(pd.value_counts) là một khung dữ liệu gấu trúc. Chúng tôi có thể vẽ các giá trị giống như bất kỳ khung dữ liệu nào khác và chọn tùy chọn subplots=True cho chúng tôi những gì chúng tôi muốn.

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