Cách tính tổng các giá trị được nhóm theo hai cột trong gấu trúc


21

Tôi có một DataFrame như thế này:

df = pd.DataFrame({
    'Date': ['2017-1-1', '2017-1-1', '2017-1-2', '2017-1-2', '2017-1-3'],
    'Groups': ['one', 'one', 'one', 'two', 'two'],
    'data': range(1, 6)})

    Date      Groups     data  
0  2017-1-1    one       1
1  2017-1-1    one       2
2  2017-1-2    one       3
3  2017-1-2    two       4
4  2017-1-3    two       5

Làm cách nào tôi có thể tạo một DataFrame mới như thế này:

    Date       one     two 
0  2017-1-1    3        0
1  2017-1-2    3        4
2  2017-1-3    0        5

Câu trả lời:


16

pivot_table đã được thực hiện cho điều này:

df.pivot_table(index='Date',columns='Groups',aggfunc=sum)

kết quả trong

         data
Groups    one  two
Date
2017-1-1  3.0  NaN
2017-1-2  3.0  4.0
2017-1-3  NaN  5.0

Cá nhân tôi thấy cách tiếp cận này dễ hiểu hơn nhiều, và chắc chắn là nhiều pythonic hơn là một hoạt động nhóm phức tạp. Sau đó, nếu bạn muốn định dạng được chỉ định, bạn có thể dọn dẹp nó:

df.fillna(0,inplace=True)
df.columns = df.columns.droplevel()
df.columns.name = None
df.reset_index(inplace=True)

mang đến cho bạn

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

1
Tốt đẹp! Đây phải là câu trả lời được chấp nhận.
tuomastik

@Josh D. Điều này thật tuyệt và đơn giản! Tôi đồng ý rằng cần một số năng lực não bộ để tìm ra cách hoạt động của nhóm. Cảm ơn bạn!
Kevin

8

Ma thuật đen gấu trúc:

df = df.groupby(['Date', 'Groups']).sum().sum(
    level=['Date', 'Groups']).unstack('Groups').fillna(0).reset_index()

# Fix the column names
df.columns = ['Date', 'one', 'two']

Kết quả df:

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

Thánh! Ma thuật đen thật mạnh mẽ! Cảm ơn rất nhiều!
Kevin

Không có gì! Xem câu trả lời cập nhật; Tôi đã đơn giản hóa biểu thức và thêm một sửa chữa cho các tên cột chính xác theo yêu cầu.
tuomastik

Tôi nghĩ rằng phiên bản trước của bạn có lợi thế vì nó có thể được áp dụng cho các bộ dữ liệu phức tạp khác. Tôi đã sao chép nó ở đây: df.groupby (['Ngày', 'Nhóm', 'dữ liệu']) ['dữ liệu']. Sum (). Sum (level = ['Ngày', 'Nhóm']). Unstack ( 'Nhóm'). Fillna (0)
Kevin

@Kevin Nếu câu trả lời này hoặc bất kỳ câu trả lời nào trong tương lai giải quyết vấn đề của bạn, vui lòng chấp nhận câu trả lời.
tuomastik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.