Pandas: ใช้ groupby เพื่อคำนวณค่าเฉลี่ยและไม่ละเลย nan


เมื่อใช้ฟังก์ชัน pandas groupby() เพื่อจัดกลุ่มตามคอลัมน์หนึ่งและคำนวณค่าเฉลี่ยของอีกคอลัมน์หนึ่ง pandas จะละเว้นค่า NaN ตามค่าเริ่มต้น

หากคุณต้องการแสดง NaN แทนหากมีค่า NaN อยู่ในคอลัมน์ คุณสามารถใช้ไวยากรณ์พื้นฐานต่อไปนี้:

 df. groupby (' team '). agg ({' points ': lambda x: x. mean (skipna= False )})

ตัวอย่างนี้จะจัดกลุ่มแถวของ DataFrame ตามคอลัมน์ Team จากนั้นคำนวณค่าเฉลี่ยของคอลัมน์ Points โดยไม่ละเว้นค่า NaN

ตัวอย่างต่อไปนี้แสดงวิธีใช้ไวยากรณ์นี้ในทางปฏิบัติ

ตัวอย่าง: ใช้ pandas groupby() และอย่าละเลย NaN

สมมติว่าเรามี DataFrame แพนด้าต่อไปนี้ซึ่งมีข้อมูลเกี่ยวกับผู้เล่นบาสเกตบอลต่างๆ:

 import pandas as pd
import numpy as np

#createDataFrame
df = pd. DataFrame ({' team ': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
                   ' points ': [15, np.nan, 24, 25, 20, 35, 34, 19, 14, 12]})

#view DataFrame
print (df)

  team points
0 to 15.0
1 A NaN
2 A 24.0
3 A 25.0
4 A 20.0
5 B 35.0
6 B 34.0
7B 19.0
8B 14.0
9B 12.0

สมมติว่าเราใช้ไวยากรณ์ต่อไปนี้ในการคำนวณค่า คะแนน เฉลี่ย โดยจัดกลุ่มตาม ทีม :

 #calculate mean of points, grouped by team
df. groupby (' team ')[' points ']. mean ()

team
At 21.0
B 22.8
Name: points, dtype: float64

โปรดทราบว่าจะมีการส่งคืนค่า คะแนน เฉลี่ยสำหรับแต่ละ ทีม แม้ว่าจะมีค่า NaN สำหรับทีม A ในคอลัมน์คะแนนก็ตาม

ตามค่าเริ่มต้น แพนด้าจะไม่สนใจค่า NaN เมื่อคำนวณค่าเฉลี่ย

หากคุณต้องการแสดง NaN เป็นค่าเฉลี่ยแทน หากมี NaN อยู่จริง คุณสามารถใช้ไวยากรณ์ต่อไปนี้:

 #calculate mean points value grouped by team and don't ignore NaNs
df. groupby (' team '). agg ({' points ': lambda x: x. mean (skipna= False )})

      points
team	
To NaN
B 22.8

โปรดทราบว่าค่า NaN จะถูกส่งกลับเป็นค่าคะแนนเฉลี่ยสำหรับทีม A ในครั้งนี้

เมื่อใช้อาร์กิวเมนต์ skipna=False เราบอกแพนด้าว่าอย่าเพิกเฉยต่อค่า NaN เมื่อคำนวณค่าเฉลี่ย

แหล่งข้อมูลเพิ่มเติม

บทช่วยสอนต่อไปนี้จะอธิบายวิธีการทำงานทั่วไปอื่นๆ ในแพนด้า:

วิธีนับค่าที่ไม่ซ้ำโดยใช้ Pandas GroupBy
วิธีใช้ฟังก์ชันกับ Pandas Groupby
วิธีสร้างพล็อตบาร์จาก Pandas GroupBy

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *