ความแตกต่างระหว่างขนาดและจำนวนในหมีแพนด้าคืออะไร?


96

นั่นคือความแตกต่างระหว่างgroupby("x").countและgroupby("x").sizeในหมีแพนด้า?

ขนาดไม่รวมศูนย์หรือไม่?


4
เอกสารระบุว่าขนาดนั้น "ส่งคืนจำนวนองค์ประกอบใน NDFrame" และนับ "ส่งคืนซีรีส์ด้วยจำนวนการสังเกตการณ์ที่ไม่ใช่ NA / null บนแกนที่ร้องขอทำงานกับข้อมูลที่ไม่ใช่จุดลอยตัวเช่นกัน (ตรวจพบ NaN และไม่มี)"
hamsternik

1
คำตอบที่ยอมรับจะระบุความแตกต่างรวมหรือไม่รวมNaNค่าต้องสังเกตว่านี่เป็นประเด็นรอง เปรียบเทียบเอาต์พุตของdf.groupby('key').size()และdf.groupby('key').count()สำหรับ DataFrame ที่มีหลายซีรี่ส์ ความแตกต่างชัดเจน: countทำงานเหมือนกับฟังก์ชันการรวมอื่น ๆ ( mean, max... ) แต่sizeเฉพาะเจาะจงในการรับจำนวนรายการดัชนีในกลุ่มดังนั้นจึงไม่ดูค่าในคอลัมน์ที่ไม่มีความหมายสำหรับฟังก์ชันนี้ ดูคำตอบ @ cs95 สำหรับคำอธิบายที่ถูกต้อง
นาที

คำตอบ:


108

sizeรวมNaNค่าcountไม่:

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 

6
ฉันคิดว่าการนับยังส่งคืน DataFrame ในขณะที่ขนาดซีรีส์?
Mr_and_Mrs_D

1
.size () ฟังก์ชั่นรับค่ารวมของคอลัมน์เฉพาะในขณะที่ใช้. column () สำหรับทุกคอลัมน์
Nachiket

ขนาด @Mr_and_Mrs_D ส่งคืนจำนวนเต็ม
boardtc

@boardtc df.size ส่งกลับตัวเลข - วิธีการ groupby จะกล่าวถึงที่นี่ดูลิงก์ในคำถาม
Mr_and_Mrs_D

สำหรับคำถามของฉัน - จำนวนและขนาดจะส่งคืน DataFrame และ Series ตามลำดับเมื่อ "ผูก" กับอินสแตนซ์ DataFrameGroupBy - ในคำถามจะผูกไว้กับ SeriesGroupBy ดังนั้นทั้งคู่จึงส่งคืนอินสแตนซ์ Series
Mr_and_Mrs_D

29

ความแตกต่างระหว่างขนาดและจำนวนในหมีแพนด้าคืออะไร?

คำตอบอื่น ๆ ได้ชี้ให้เห็นความแตกต่าง แต่มันเป็นสิ่งไม่ถูกต้องสมบูรณ์จะพูดว่า " 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โต้แย้งและเมื่อไม่มีอะไรผ่านไปแพนด้าก็ตัดสินใจที่จะไม่ตั้งสมมติฐาน


7

เพียงเพื่อเพิ่มคำตอบของ @ 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หมีแพนด้า
QM.py

@ QM.py ไม่ใช่ไม่ใช่ เหตุผลสำหรับความแตกต่างในการgroupbyส่งออกจะมีการอธิบายที่นี่
cs95

1

เมื่อเราจัดการกับดาต้าเฟรมปกติความแตกต่างเพียงอย่างเดียวคือการรวมค่า NAN หมายความว่า count ไม่รวมค่า NAN ในขณะที่นับแถว

แต่ถ้าเราใช้ฟังก์ชันเหล่านี้กับสิ่งgroupbyนั้นเพื่อให้ได้ผลลัพธ์ที่ถูกต้องโดยcount()เราต้องเชื่อมโยงฟิลด์ตัวเลขใด ๆ กับgroupbyเพื่อให้ได้จำนวนกลุ่มที่แน่นอนโดยที่size()ไม่จำเป็นต้องมีการเชื่อมโยงประเภทนี้


0

นอกเหนือจากคำตอบข้างต้นทั้งหมดแล้วฉันอยากจะชี้ให้เห็นความแตกต่างอีกประการหนึ่งซึ่งดูเหมือนว่าสำคัญ

คุณสามารถDatarameเทียบขนาดของแพนด้าและนับกับVectorsขนาดและความยาวของ Java เมื่อเราสร้างเวกเตอร์หน่วยความจำที่กำหนดไว้ล่วงหน้าจะถูกจัดสรรให้กับมัน เมื่อเราเข้าใกล้จำนวนองค์ประกอบที่สามารถครอบครองได้ในขณะที่เพิ่มองค์ประกอบหน่วยความจำจะถูกจัดสรรให้กับมันมากขึ้น ในทำนองเดียวกันDataFrameเมื่อเราเพิ่มองค์ประกอบหน่วยความจำที่จัดสรรให้จะเพิ่มขึ้น

แอตทริบิวต์ขนาดทำให้จำนวนเซลล์หน่วยความจำที่จัดสรรให้ในขณะที่การนับให้จำนวนขององค์ประกอบที่เป็นจริงในปัจจุบันDataFrame DataFrameตัวอย่างเช่น, ป้อนคำอธิบายภาพที่นี่

คุณสามารถดูได้ว่ามี 3 แถวDataFrameขนาดคือ 6

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

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