Pandas รวมตาม groupby แต่ไม่รวมบางคอลัมน์


89

วิธีใดเป็นวิธีที่ดีที่สุดในการทำ groupby บนดาต้าเฟรมของ Pandas แต่ไม่รวมคอลัมน์บางคอลัมน์จาก groupby นั้น เช่นฉันมี dataframe ต่อไปนี้:

Code   Country      Item_Code   Item    Ele_Code    Unit    Y1961    Y1962   Y1963
2      Afghanistan  15          Wheat   5312        Ha      10       20      30
2      Afghanistan  25          Maize   5312        Ha      10       20      30
4      Angola       15          Wheat   7312        Ha      30       40      50
4      Angola       25          Maize   7312        Ha      30       40      50

ฉันต้องการจัดกลุ่มตามคอลัมน์ Country และ Item_Code และคำนวณเฉพาะผลรวมของแถวที่อยู่ใต้คอลัมน์ Y1961, Y1962 และ Y1963 ดาต้าเฟรมที่ได้ควรมีลักษณะดังนี้:

Code   Country      Item_Code   Item    Ele_Code    Unit    Y1961    Y1962   Y1963
2      Afghanistan  15          C3      5312        Ha      20       40       60
4      Angola       25          C4      7312        Ha      60       80      100

ตอนนี้ฉันกำลังทำสิ่งนี้:

df.groupby('Country').sum()

อย่างไรก็ตามสิ่งนี้จะเพิ่มค่าในคอลัมน์ Item_Code ด้วย มีวิธีใดบ้างที่ฉันสามารถระบุคอลัมน์ที่จะรวมไว้ในการsum()ดำเนินการและคอลัมน์ใดที่จะยกเว้นได้

คำตอบ:


120

คุณสามารถเลือกคอลัมน์ของ groupby:

In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
                       Y1961  Y1962  Y1963
Country     Item_Code
Afghanistan 15            10     20     30
            25            10     20     30
Angola      15            30     40     50
            25            30     40     50

โปรดทราบว่ารายการที่ส่งต้องเป็นส่วนย่อยของคอลัมน์มิฉะนั้นคุณจะเห็น KeyError


1
จะรวมจำนวนระเบียนสำหรับแต่ละประเทศและรหัสสินค้าเป็นคอลัมน์อื่นได้อย่างไร
Sushant Kulkarni

คุณสามารถสร้างคอลัมน์ดัมมี่ก่อนที่จะจัดกลุ่มตามที่มีเพียง 1 จากนั้นผลรวมจะรวมกันสร้างจำนวน
Matt W.

หากคุณต้องการยกเว้นคอลัมน์หรือสองคอลัมน์คุณจะได้รับชื่อคอลัมน์ทั้งหมดlistColumns = list(df.columns)จากนั้นคุณจะลบคอลัมน์ที่คุณไม่ต้องการlistColumns.remove('Y1964')และในที่สุดก็ทำการสรุป:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
Roberto Stelling

ขอบคุณมาก. ฉันสามารถทำให้ groupby ทำงานได้ แต่ไม่ใช่ส่วนที่เลือก รายการคอลัมน์ที่ฉันใส่อยู่ในดาต้าเฟรม แต่ก็ยังคงเพิ่ม ValueError:cannot reindex from a duplicate axis
Bowen Liu

@BowenLiu หากคุณมีหลายคอลัมน์ที่มีชื่อเดียวกันจะแสดงข้อผิดพลาดนี้ ในกรณีนี้คุณจะต้องใช้ iloc to หรือ loc เพื่อรับคอลัมน์ที่คุณต้องการฉันคิดว่าคุณจะต้องทำก่อน groupby
Andy Hayden

40

aggฟังก์ชั่นจะทำเพื่อคุณ ส่งผ่านคอลัมน์และฟังก์ชันเป็นคำสั่งด้วยคอลัมน์เอาต์พุต:

df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]})  # Added example for two output columns from a single input column

ซึ่งจะแสดงเฉพาะกลุ่มตามคอลัมน์และคอลัมน์รวมที่ระบุ ในตัวอย่างนี้ฉันรวมฟังก์ชัน agg สองฟังก์ชันที่ใช้กับ 'Y1962'

เพื่อให้ได้สิ่งที่คุณหวังว่าจะเห็นให้รวมคอลัมน์อื่น ๆ ในกลุ่มด้วยและใช้ผลรวมกับตัวแปร Y ในเฟรม:

df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})

1
ขอบคุณสิ่งนี้สามารถสรุปได้หรือไม่? ฉันมีคอลัมน์มากมายในรูปแบบ Y1961 ... ดังนั้นฉันจึงสร้างรายการแบบนี้: yrs = ['Y' + str (x) สำหรับ x ในช่วง (1961, 2010 + 1, 1)] โซลูชันของคุณสามารถใช้ 'yrs' ใน agg ได้หรือไม่?
user308827

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

11

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

columns = ['Y'+str(i) for year in range(1967, 2011)]

df.groupby('Country')[columns].agg('sum')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.