2016-02-23 53 views
7

Giả sử rằng tôi có một dataframe với các giá trị sau:Pandas dataframe: Đoàn tự do hai cột và sau đó trung bình trên một cột

df: 
col1 col2 value 
1  2  3 
1  2  1 
2  3  1 

Tôi muốn đầu tiên groupby dataframe của tôi dựa trên hai cột đầu tiên (col1 và col2) và sau đó trung bình trên các giá trị của cột thirs (giá trị). Vì vậy, các đầu ra mong muốn sẽ trông như thế này:

col1 col2 avg-value 
1  2  2 
2  3  1 

Tôi đang sử dụng đoạn mã sau:

columns = ['col1','col2','avg'] 
df = pd.DataFrame(columns=columns) 
df.loc[0] = [1,2,3] 
df.loc[1] = [1,3,3] 
print(df[['col1','col2','avg']].groupby('col1','col2').mean()) 

mà được các lỗi sau:

ValueError: No axis named col2 for object type <class 'pandas.core.frame.DataFrame'> 

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao.

Trả lời

8

Bạn cần phải vượt qua một danh sách các cột để groupby, những gì bạn đã thông qua được giải thích như là axis param đó là lý do nó đưa ra một lỗi:

In [30]: 
columns = ['col1','col2','avg'] 
df = pd.DataFrame(columns=columns) 
df.loc[0] = [1,2,3] 
df.loc[1] = [1,3,3] 

print(df[['col1','col2','avg']].groupby(['col1','col2']).mean()) 
      avg 
col1 col2  
1 2  3 
    3  3 
3

Nếu bạn muốn nhóm theo nhiều cột, bạn nên đặt chúng trong một danh sách:

columns = ['col1','col2','value'] df = pd.DataFrame(columns=columns) df.loc[0] = [1,2,3] df.loc[1] = [1,3,3] df.loc[2] = [2,3,1] print(df.groupby(['col1','col2']).mean())

Hoặc hơi dài dòng hơn, vì lợi ích của việc từ 'trung bình' tại dataframe tổng hợp của bạn:

01.235.

import numpy as np columns = ['col1','col2','value'] df = pd.DataFrame(columns=columns) df.loc[0] = [1,2,3] df.loc[1] = [1,3,3] df.loc[2] = [2,3,1] print(df.groupby(['col1','col2']).agg({'value': {'avg': np.mean}}))

+0

Điều này khác với câu trả lời của tôi như thế nào? – EdChum

+0

Nó không phải, nhưng tôi chỉ nhìn thấy câu trả lời của bạn sau khi tôi nhấn 'post' ... – jkokorian

+0

Đừng lo lắng, nhưng không nên đăng câu trả lời trùng lặp trừ khi có sự khác biệt thực sự – EdChum

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