นั่นคือความแตกต่างระหว่างgroupby("x").countและgroupby("x").sizeในหมีแพนด้า?
ขนาดไม่รวมศูนย์หรือไม่?
นั่นคือความแตกต่างระหว่างgroupby("x").countและgroupby("x").sizeในหมีแพนด้า?
ขนาดไม่รวมศูนย์หรือไม่?
NaNค่าต้องสังเกตว่านี่เป็นประเด็นรอง เปรียบเทียบเอาต์พุตของdf.groupby('key').size()และdf.groupby('key').count()สำหรับ DataFrame ที่มีหลายซีรี่ส์ ความแตกต่างชัดเจน: countทำงานเหมือนกับฟังก์ชันการรวมอื่น ๆ ( mean, max... ) แต่sizeเฉพาะเจาะจงในการรับจำนวนรายการดัชนีในกลุ่มดังนั้นจึงไม่ดูค่าในคอลัมน์ที่ไม่มีความหมายสำหรับฟังก์ชันนี้ ดูคำตอบ @ cs95 สำหรับคำอธิบายที่ถูกต้อง
คำตอบ:
In [46]:
df = pd.DataFrame({'a':[0,0,1,2,2,2], 'b':[1,2,3,4,np.NaN,4], 'c':np.random.randn(6)})
df
Out[46]:
a b c
0 0 1 1.067627
1 0 2 0.554691
2 1 3 0.458084
3 2 4 0.426635
4 2 NaN -2.238091
5 2 4 1.256943
In [48]:
print(df.groupby(['a'])['b'].count())
print(df.groupby(['a'])['b'].size())
a
0 2
1 1
2 2
Name: b, dtype: int64
a
0 2
1 1
2 3
dtype: int64
ความแตกต่างระหว่างขนาดและจำนวนในหมีแพนด้าคืออะไร?
คำตอบอื่น ๆ ได้ชี้ให้เห็นความแตกต่าง แต่มันเป็นสิ่งไม่ถูกต้องสมบูรณ์จะพูดว่า " sizeนับแก่นแก้วในขณะที่countไม่ได้" แม้ว่าsizeจะนับ NaNs แต่จริงๆแล้วนี่เป็นผลมาจากความจริงที่sizeส่งคืนขนาด (หรือความยาว) ของวัตถุที่ถูกเรียกใช้ โดยปกติสิ่งนี้ยังรวมถึงแถว / ค่าซึ่งเป็น NaN
ดังนั้นเพื่อสรุปsizeส่งกลับขนาดของ Series / DataFrame 1 ,
df = pd.DataFrame({'A': ['x', 'y', np.nan, 'z']})
df
A
0 x
1 y
2 NaN
3 z
df.A.size
# 4
... ในขณะที่countนับค่าที่ไม่ใช่ NaN:
df.A.count()
# 3
สังเกตว่าsizeเป็นแอตทริบิวต์ (ให้ผลลัพธ์เช่นเดียวกับlen(df)หรือlen(df.A)) countเป็นฟังก์ชัน
1. DataFrame.sizeเป็นแอตทริบิวต์และส่งคืนจำนวนองค์ประกอบใน DataFrame (แถว x คอลัมน์)
GroupBy- โครงสร้างผลลัพธ์นอกจากนี้ยังแตกต่างขั้นพื้นฐานนอกจากนี้ยังมีความแตกต่างในโครงสร้างของการส่งออกที่สร้างขึ้นเมื่อเรียกVSGroupBy.size()GroupBy.count()
df = pd.DataFrame({'A': list('aaabbccc'), 'B': ['x', 'x', np.nan, np.nan, np.nan, np.nan, 'x', 'x']})
df
A B
0 a x
1 a x
2 a NaN
3 b NaN
4 b NaN
5 c NaN
6 c x
7 c x
พิจารณา,
df.groupby('A').size()
A
a 3
b 2
c 3
dtype: int64
เมื่อเทียบกับ
df.groupby('A').count()
B
A
a 2
b 0
c 2
GroupBy.countส่งคืน DataFrame เมื่อคุณเรียกcountใช้คอลัมน์ทั้งหมดในขณะที่GroupBy.sizeส่งกลับซีรี่ส์
เหตุผลที่sizeเหมือนกันสำหรับทุกคอลัมน์จึงส่งคืนผลลัพธ์เพียงรายการเดียว ในขณะเดียวกันcountจะเรียกสำหรับแต่ละคอลัมน์เนื่องจากผลลัพธ์จะขึ้นอยู่กับจำนวน NaN ในแต่ละคอลัมน์
pivot_tableอีกตัวอย่างหนึ่งคือวิธีpivot_tableปฏิบัติต่อข้อมูลนี้ สมมติว่าเราต้องการคำนวณตารางไขว้ของ
df
A B
0 0 1
1 0 1
2 1 2
3 0 2
4 0 0
pd.crosstab(df.A, df.B) # Result we expect, but with `pivot_table`.
B 0 1 2
A
0 1 2 1
1 0 0 1
ด้วยpivot_tableคุณสามารถออกsize:
df.pivot_table(index='A', columns='B', aggfunc='size', fill_value=0)
B 0 1 2
A
0 1 2 1
1 0 0 1
แต่countไม่ทำงาน; DataFrame ที่ว่างเปล่าจะถูกส่งกลับ:
df.pivot_table(index='A', columns='B', aggfunc='count')
Empty DataFrame
Columns: []
Index: [0, 1]
ฉันเชื่อว่าเหตุผลนี้คือสิ่งที่'count'ต้องทำในซีรีส์ที่ส่งต่อไปยังการvaluesโต้แย้งและเมื่อไม่มีอะไรผ่านไปแพนด้าก็ตัดสินใจที่จะไม่ตั้งสมมติฐาน
เพียงเพื่อเพิ่มคำตอบของ @ Edchum เล็กน้อยแม้ว่าข้อมูลจะไม่มีค่า NA ผลลัพธ์ของ count () จะมีรายละเอียดมากกว่าโดยใช้ตัวอย่างก่อนหน้านี้:
grouped = df.groupby('a')
grouped.count()
Out[197]:
b c
a
0 2 2
1 1 1
2 2 3
grouped.size()
Out[198]:
a
0 2
1 1
2 3
dtype: int64
sizeจะสง่างามเทียบเท่ากับcountหมีแพนด้า
เมื่อเราจัดการกับดาต้าเฟรมปกติความแตกต่างเพียงอย่างเดียวคือการรวมค่า NAN หมายความว่า count ไม่รวมค่า NAN ในขณะที่นับแถว
แต่ถ้าเราใช้ฟังก์ชันเหล่านี้กับสิ่งgroupbyนั้นเพื่อให้ได้ผลลัพธ์ที่ถูกต้องโดยcount()เราต้องเชื่อมโยงฟิลด์ตัวเลขใด ๆ กับgroupbyเพื่อให้ได้จำนวนกลุ่มที่แน่นอนโดยที่size()ไม่จำเป็นต้องมีการเชื่อมโยงประเภทนี้
นอกเหนือจากคำตอบข้างต้นทั้งหมดแล้วฉันอยากจะชี้ให้เห็นความแตกต่างอีกประการหนึ่งซึ่งดูเหมือนว่าสำคัญ
คุณสามารถDatarameเทียบขนาดของแพนด้าและนับกับVectorsขนาดและความยาวของ Java เมื่อเราสร้างเวกเตอร์หน่วยความจำที่กำหนดไว้ล่วงหน้าจะถูกจัดสรรให้กับมัน เมื่อเราเข้าใกล้จำนวนองค์ประกอบที่สามารถครอบครองได้ในขณะที่เพิ่มองค์ประกอบหน่วยความจำจะถูกจัดสรรให้กับมันมากขึ้น ในทำนองเดียวกันDataFrameเมื่อเราเพิ่มองค์ประกอบหน่วยความจำที่จัดสรรให้จะเพิ่มขึ้น
แอตทริบิวต์ขนาดทำให้จำนวนเซลล์หน่วยความจำที่จัดสรรให้ในขณะที่การนับให้จำนวนขององค์ประกอบที่เป็นจริงในปัจจุบันDataFrame DataFrameตัวอย่างเช่น,

คุณสามารถดูได้ว่ามี 3 แถวDataFrameขนาดคือ 6
ขนาดนี้คำตอบที่ครอบคลุมและความแตกต่างนับด้วยความเคารพและไม่ได้DataFrame Pandas Seriesฉันยังไม่ได้ตรวจสอบว่าเกิดอะไรขึ้นกับSeries