Python: รับการนับความถี่ตามสองคอลัมน์ (ตัวแปร) ในแพนด้าดาต้าเฟรมบางแถว


93

สวัสดีฉันมี dataframe ต่อไปนี้

    Group           Size

    Short          Small
    Short          Small
    Moderate       Medium
    Moderate       Small
    Tall           Large

ฉันต้องการนับความถี่ของจำนวนครั้งที่แถวเดียวกันปรากฏในดาต้าเฟรม

    Group           Size      Time

    Short          Small        2
    Moderate       Medium       1 
    Moderate       Small        1
    Tall           Large        1

1
หมายเหตุเกี่ยวกับประสิทธิภาพรวมถึงทางเลือกอื่น ๆ : Pandas groupby.size vs series.value_counts vs คอลเลกชันเคาน์เตอร์ที่มีหลายซีรีส์
jpp

คำตอบ:


145

คุณสามารถใช้ groupby's size:

In [11]: df.groupby(["Group", "Size"]).size()
Out[11]:
Group     Size
Moderate  Medium    1
          Small     1
Short     Small     2
Tall      Large     1
dtype: int64

In [12]: df.groupby(["Group", "Size"]).size().reset_index(name="Time")
Out[12]:
      Group    Size  Time
0  Moderate  Medium     1
1  Moderate   Small     1
2     Short   Small     2
3      Tall   Large     1

7
ขอบคุณ. การเพิ่มเล็กน้อยเพื่อเลือกค่า k อันดับสูงสุด (= 20) ตามความถี่ ("เวลา"): df.groupby (["Group", "Size"]). size (). reset_index (name = "Time") .sort_values ​​(โดย = 'เวลา', จากน้อยไปมาก = เท็จ) .head (20);
Dileep Kumar Patchigolla

1
สังเกตว่าการใช้.size()จะส่งกลับ Series ในขณะที่.size().reset_index(name="Time")เป็น DataFrame ขอบคุณแอนดี้
alemol

หรือคุณสามารถทำได้df.groupby(by=["Group", "Size"], as_index=False).size()ง่ายๆ
Naveen Kumar

51

อัปเดตหลังจาก pandas 1.1value_countsตอนนี้ยอมรับหลายคอลัมน์

df.value_counts(["Group", "Size"])

คุณยังสามารถลอง pd.crosstab()

Group           Size

Short          Small
Short          Small
Moderate       Medium
Moderate       Small
Tall           Large

pd.crosstab(df.Group,df.Size)


Size      Large  Medium  Small
Group                         
Moderate      0       1      1
Short         0       0      2
Tall          1       0      0

แก้ไข: เพื่อที่จะออกไปข้างนอก

pd.crosstab(df.Group,df.Size).replace(0,np.nan).\
     stack().reset_index().rename(columns={0:'Time'})
Out[591]: 
      Group    Size  Time
0  Moderate  Medium   1.0
1  Moderate   Small   1.0
2     Short   Small   2.0
3      Tall   Large   1.0

7
ดี. คุณสามารถเพิ่มmargins=Trueเพื่อรับการนับส่วนเพิ่มได้!
Matt Hancock

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