วิธีหาผลรวมค่าจัดกลุ่มตามสองคอลัมน์ในนุ่น


21

ฉันมี Pandas DataFrame เช่นนี้:

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

ฉันจะสร้าง DataFrame ใหม่เช่นนี้ได้อย่างไร:

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

คำตอบ:


16

pivot_table ถูกสร้างขึ้นสำหรับสิ่งนี้:

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

ผลลัพธ์ใน

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

โดยส่วนตัวแล้วฉันพบว่าวิธีนี้ง่ายกว่าที่จะเข้าใจและแน่นอนยิ่งกว่าการทำแบบกลุ่มที่ซับซ้อน จากนั้นหากคุณต้องการรูปแบบที่ระบุคุณสามารถจัดรูปแบบให้เป็นระเบียบได้:

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

ที่ให้คุณ

       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
ดี! นี่ควรเป็นคำตอบที่ยอมรับได้
tuomastik

@Josh D. มันเจ๋งและตรงไปตรงมา! ฉันยอมรับว่าต้องใช้พลังสมองในการคิดว่า groupby ทำงานอย่างไร ขอขอบคุณ!
Kevin

8

นุ่นมนต์ดำ:

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']

ผลลัพธ์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

บริสุทธิ์! เวทมนตร์สีดำมีพลังมาก! ขอบคุณมาก!
Kevin

ยินดีต้อนรับคุณ! ดูคำตอบที่อัพเดต; ฉันทำให้นิพจน์ง่ายขึ้นและเพิ่มการแก้ไขสำหรับชื่อคอลัมน์ให้ตรงตามที่ร้องขอ
tuomastik

ฉันคิดว่าเวอร์ชันก่อนหน้าของคุณมีข้อได้เปรียบเนื่องจากสามารถนำไปใช้กับชุดข้อมูลที่ซับซ้อนกว่า ฉันคัดลอกมาที่นี่: df.groupby (['วันที่', 'กลุ่ม', 'ข้อมูล']) ['ข้อมูล']. ผลรวม (). ผลรวม (ระดับ = ['วันที่', 'กลุ่ม']). unstack ( 'กลุ่ม'). fillna (0)
Kevin

@Kevin หากคำตอบนี้หรือในอนาคตสามารถแก้ไขปัญหาของคุณได้โปรดยอมรับคำตอบ
tuomastik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.