2013-07-17 39 views
27

Tôi quen thuộc hơn với R nhưng tôi muốn xem liệu có cách nào để làm điều này trong gấu trúc hay không. Tôi muốn tạo ra một số các giá trị duy nhất từ ​​một trong các cột dataframe của tôi và sau đó thêm một cột mới với những giá trị đó được tính vào khung dữ liệu ban đầu của tôi. Tôi đã thử một vài thứ khác nhau. Tôi đã tạo một chuỗi gấu trúc và sau đó tính số lượng bằng phương pháp value_counts. Tôi đã cố gắng để hợp nhất các giá trị này trở lại dataframe ban đầu của tôi, nhưng tôi các phím mà tôi muốn hợp nhất là trong Index (ix/loc). Bất cứ đề nghị hoặc giải pháp sẽ được đánh giáTôi muốn tạo một cột giá trị_counts trong khung dữ liệu gấu trúc của tôi

Color Value 
Red 100 
Red 150 
Blue 50 

và tôi muốn trở lại cái gì đó như

Color Value Counts 
Red 100 2 
Red 150 2 
Blue 50 1 
+1

Đây là câu hỏi phổ biến gần đây. Xem câu hỏi này [ở đây] (http://stackoverflow.com/questions/17666075/python-pandas-groupby-result/17666287#17666287) gần giống với tình huống của bạn. – bdiamante

Trả lời

37
df['Counts'] = df.groupby(['Color'])['Value'].transform('count') 

Ví dụ,

In [102]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}) 

In [103]: df 
Out[103]: 
    Color Value 
0 Red 100 
1 Red 150 
2 Blue  50 

In [104]: df['Counts'] = df.groupby(['Color'])['Value'].transform('count') 

In [105]: df 
Out[105]: 
    Color Value Counts 
0 Red 100  2 
1 Red 150  2 
2 Blue  50  1 

Lưu ý rằng transform('count') bỏ qua Nans. Nếu bạn muốn đếm số NaN, hãy sử dụng transform(len).


Để trình chỉnh sửa ẩn danh: Nếu bạn gặp lỗi khi sử dụng transform('count') có thể là do phiên bản Pandas của bạn quá cũ. Các công trình trên với gấu trúc phiên bản 0,15 trở lên.

+0

Cảm ơn rất nhiều. Rất hữu ích. Tôi đã cố gắng áp dụng điều đó cho một DataFrame lớn hơn và tiếp tục nhận được lỗi này "ValueError: Số lượng mục sai được thông qua 1, các chỉ mục ngụ ý 4". – user2592989

+2

Hãy thử chọn chỉ một cột để chuyển đổi tức là df.groupby (['Màu']) [] .transform ('count') – user1827356

+0

được thêm vào sách dạy nấu ăn: http://pandas.pydata.org/pandas-docs/dev /cookbook.html#grouping (tài liệu sẽ xây dựng vào ngày mai) – Jeff

2

Suy nghĩ ban đầu của tôi là sử dụng tính năng hiểu danh sách như được hiển thị bên dưới nhưng, như đã được chỉ ra trong nhận xét, tốc độ này chậm hơn phương pháp groupbytransform. Tôi sẽ để lại câu trả lời này để chứng minh GÌ KHÔNG ĐƯỢC LÀM:

In [94]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}) 
In [95]: df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))] 
In [96]: df 
Out[100]: 
    Color Value Counts 
0 Red 100  2 
1 Red 150  2 
2 Blue  50  1 

[3 rows x 3 columns] 

@ phương pháp unutbu của trở nên phức tạp cho DataFrames với nhiều cột mà làm này đơn giản hơn để mã. Nếu bạn đang làm việc với một khung dữ liệu nhỏ, điều này sẽ nhanh hơn (xem bên dưới), nhưng nếu không, bạn nên sử dụng NOT sử dụng khung này.

In [97]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = df.groupby(['Color']).transform('count') 
100 loops, best of 3: 2.87 ms per loop 
In [98]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))] 
1000 loops, best of 3: 1.03 ms per loop 
+3

Ví dụ với 3 hàng là rất gây hiểu lầm với thời gian. Hãy thử nó với một dataframe lớn hơn, và bạn sẽ thấy rằng cách tiếp cận groupby là * nhiều * nhanh hơn (tôi đã thử nó với 'df' của bạn lặp lại 1000 lần (' df = pd.concat ([df] * 1000, ignore_index = True) ') và nhận được 3,6 ms (gropuby) so với 29 s (danh sách hiểu)). Hơn nữa, tôi nghĩ rằng cách tiếp cận groupby đơn giản hơn. – joris

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