2013-10-22 70 views
24

1). Tôi có một tập dữ liệu mẫu sau:Đổi tên tên cột trong Pandas Chức năng nhóm

>>> df 
    ID  Region count 
0 100  Asia  2 
1 101  Europe  3 
2 102   US  1 
3 103  Africa  5 
4 100  Russia  5 
5 101 Australia  7 
6 102   US  8 
7 104  Asia  10 
8 105  Europe  11 
9 110  Africa  23 

Tôi muốn nhóm các quan sát của tập dữ liệu này theo ID một vùng và tính tổng số cho mỗi nhóm. Vì vậy, tôi đã sử dụng một cái gì đó như thế này:

>>> print(df.groupby(['ID','Region'],as_index=False).count.sum()) 

    ID  Region count 
0 100  Asia  2 
1 100  Russia  5 
2 101 Australia  7 
3 101  Europe  3 
4 102   US  9 
5 103  Africa  5 
6 104  Asia  10 
7 105  Europe  11 
8 110  Africa  23 

Khi sử dụng as_index = False Tôi có thể nhận được kết quả "Sql-Like". Vấn đề của tôi là tôi không thể đổi tên tổng số biến tổng hợp ở đây. Vì vậy, trong Sql nếu muốn làm điều trên, chúng tôi sẽ làm một cái gì đó như thế này:

select ID, Region, sum(count) as Total_Numbers 
from df 
group by ID,Region 
order by ID, Region 

Như chúng ta thấy, nó rất dễ dàng cho tôi để đổi tên các tập hợp biến 'đếm' để Total_Numbers trong SQL. Tôi muốn làm điều tương tự trong Pandas nhưng không thể tìm thấy tùy chọn như vậy trong chức năng groupby. Ai đó có thể giúp?

2). Câu hỏi thứ hai và nhiều hơn nữa của một quan sát là có thể sử dụng trực tiếp các tên cột trong Pandas dataframe chức năng witout kèm theo chúng bên trong dấu ngoặc kép? Tôi hiểu rằng các tên biến là chuỗi, do đó, phải được bên trong dấu ngoặc kép, nhưng tôi thấy nếu sử dụng bên ngoài dataframe chức năng và như là một thuộc tính chúng tôi không yêu cầu họ được bên trong dấu ngoặc kép. Giống như df.ID.sum() vv. Chỉ khi chúng ta sử dụng nó trong một hàm DataFrame như df.sort() hoặc df.groupby, chúng ta phải sử dụng nó bên trong dấu ngoặc kép. Điều này thực sự là một chút đau như trong SQL hoặc trong SAS hoặc ngôn ngữ khác, chúng tôi chỉ đơn giản là sử dụng tên biến mà không trích dẫn chúng. Bất cứ đề nghị về điều này?

Vui lòng đề xuất trên hai điểm trên (1 điểm chính, thêm 2 ý kiến).

Cảm ơn

Trả lời

28

Đối với câu hỏi đầu tiên tôi nghĩ rằng câu trả lời sẽ là:

<your DataFrame>.rename(columns={'count':'Total_Numbers'}) 

hoặc

<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers'] 

Đối với một thứ hai tôi muốn nói câu trả lời sẽ là không. Có thể sử dụng nó như 'df.ID' vì python datamodel:

thuộc tính tài liệu tham khảo được dịch sang tra cứu trong từ điển này, ví dụ m.x tương đương với m. dict [ "x"]

+0

Thxs cho response.The đổi tên điều đã giúp, ngoại trừ việc tôi đoán trong cú pháp đầu tiên chúng ta cũng cần phải đề cập đến các cột = .. vì vậy, .rename (columns = {'count': 'Total_Numbers' }). Khác nó sẽ lấy nó cho chỉ mục và không thay đổi tên cột. Điều thứ hai hoạt động hoàn hảo, nhưng nếu một hoặc hai biến cần phải được đổi tên thì tôi đoán đầu tiên là thuận tiện hơn là đề cập đến tất cả các tên biến trong cú pháp thứ hai. Tôi đã hy vọng nếu có cái gì đó trong groupby nhưng có vẻ như không có. Ngoài ra tôi hiểu gấu trúc df là một bản chất dict.Was hy vọng cho một số tính linh hoạt trong Panda – Baktaawar

14

hiện nay (như các phiên bản 0.20) phương pháp để thay đổi tên cột sau một ca mổ groupby là chuỗi các phương pháp rename. Xem this deprecation note trong tài liệu để biết thêm chi tiết.

Deprecated trả lời như của gấu trúc phiên bản 0.20

Đây là kết quả đầu tiên trong google và mặc dù câu trả lời đầu làm việc nó không thực sự trả lời câu hỏi. Có một better answer here và dài discussion on github về chức năng đầy đủ của việc chuyển từ điển sang phương thức agg.

Rất tiếc, các câu trả lời này không tồn tại trong tài liệu nhưng định dạng chung cho nhóm, tổng hợp và sau đó đổi tên cột sử dụng từ điển từ điển. Các khóa để từ điển bên ngoài là các tên cột được tổng hợp.Các từ điển bên trong có các khóa mà cột mới đặt tên với các giá trị như hàm tổng hợp.

Trước khi chúng tôi đến đó, hãy tạo một DataFrame bốn cột.

df = pd.DataFrame({'A' : list('wwwwxxxx'), 
        'B':list('yyzzyyzz'), 
        'C':np.random.rand(8), 
        'D':np.random.rand(8)}) 

    A B   C   D 
0 w y 0.643784 0.828486 
1 w y 0.308682 0.994078 
2 w z 0.518000 0.725663 
3 w z 0.486656 0.259547 
4 x y 0.089913 0.238452 
5 x y 0.688177 0.753107 
6 x z 0.955035 0.462677 
7 x z 0.892066 0.368850 

Hãy nói rằng chúng ta muốn nhóm theo cột A, B và cột tổng C với meanmedian và tổng cột D với max. Các mã sau đây sẽ làm điều này.

df.groupby(['A', 'B']).agg({'C':['mean', 'median'], 'D':'max'}) 

      D   C   
      max  mean median 
A B        
w y 0.994078 0.476233 0.476233 
    z 0.725663 0.502328 0.502328 
x y 0.753107 0.389045 0.389045 
    z 0.462677 0.923551 0.923551 

Điều này trả về một DataFrame với chỉ mục phân cấp. Câu hỏi ban đầu được hỏi về việc đổi tên các cột trong cùng một bước. Điều này có thể sử dụng một cuốn từ điển các từ điển:

df.groupby(['A', 'B']).agg({'C':{'C_mean': 'mean', 'C_median': 'median'}, 
          'D':{'D_max': 'max'}}) 

      D   C   
     D_max C_mean C_median 
A B        
w y 0.994078 0.476233 0.476233 
    z 0.725663 0.502328 0.502328 
x y 0.753107 0.389045 0.389045 
    z 0.462677 0.923551 0.923551 

này đổi tên các cột tất cả chỉ trong một bước nhưng vẫn còn để chỉ số thứ bậc mà cấp cao nhất có thể được giảm với df.columns = df.columns.droplevel(0).

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