วิธีหมุนเดตาล็อกไฟล์


360
  • สาระสำคัญคืออะไร?
  • ฉันจะหมุนได้อย่างไร
  • นี่คือสาระสำคัญหรือไม่?
  • รูปแบบยาวเป็นรูปแบบกว้าง?

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

... แต่ฉันจะปล่อยมันไป


ปัญหาเกี่ยวกับคำถามและคำตอบที่มีอยู่ก็คือคำถามมักมุ่งเน้นไปที่ความแตกต่างที่ OP มีปัญหาในการพูดคุยเพื่อใช้คำตอบที่ดีที่มีอยู่จำนวนมาก อย่างไรก็ตามไม่มีคำตอบใดที่พยายามให้คำอธิบายที่ครอบคลุม (เพราะมันเป็นงานที่น่ากลัว)

ดูตัวอย่างจากการค้นหา googleของฉัน

  1. วิธีหมุนเดตาไฟล์ใน Pandas ได้อย่างไร
    • คำถามและคำตอบที่ดี แต่คำตอบเพียงตอบคำถามเฉพาะพร้อมคำอธิบายเล็กน้อย
  2. pandas pivot table ไปยัง data frame
    • ในคำถามนี้ OP เกี่ยวข้องกับผลลัพธ์ของ pivot คือลักษณะของคอลัมน์ OP ต้องการให้ดูเหมือน R นี่ไม่ได้มีประโยชน์มากสำหรับผู้ใช้แพนด้า
  3. pandas pivoting dataframe, แถวที่ซ้ำกัน
    • อีกคำถามที่ดี แต่คำตอบนั้นเน้นที่วิธีหนึ่งคือ pd.DataFrame.pivot

ดังนั้นเมื่อใดก็ตามที่มีคนค้นหาpivotพวกเขาจะได้ผลลัพธ์เป็นระยะ ๆ ซึ่งไม่น่าจะตอบคำถามเฉพาะของพวกเขา


ติดตั้ง

คุณอาจสังเกตเห็นว่าฉันตั้งชื่อคอลัมน์ของฉันและค่าคอลัมน์ที่เกี่ยวข้องอย่างชัดเจนเพื่อให้สอดคล้องกับวิธีที่ฉันจะ pivot ในคำตอบด้านล่าง

import numpy as np
import pandas as pd
from numpy.core.defchararray import add

np.random.seed([3,1415])
n = 20

cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)

df = pd.DataFrame(
    add(cols, arr1), columns=cols
).join(
    pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val')
)
print(df)

     key   row   item   col  val0  val1
0   key0  row3  item1  col3  0.81  0.04
1   key1  row2  item1  col2  0.44  0.07
2   key1  row0  item1  col0  0.77  0.01
3   key0  row4  item0  col2  0.15  0.59
4   key1  row0  item2  col1  0.81  0.64
5   key1  row2  item2  col4  0.13  0.88
6   key2  row4  item1  col3  0.88  0.39
7   key1  row4  item1  col1  0.10  0.07
8   key1  row0  item2  col4  0.65  0.02
9   key1  row2  item0  col2  0.35  0.61
10  key2  row0  item2  col1  0.40  0.85
11  key2  row4  item1  col2  0.64  0.25
12  key0  row2  item2  col3  0.50  0.44
13  key0  row4  item1  col4  0.24  0.46
14  key1  row3  item2  col3  0.28  0.11
15  key0  row3  item1  col1  0.31  0.23
16  key0  row0  item2  col3  0.86  0.01
17  key0  row4  item0  col3  0.64  0.21
18  key2  row2  item2  col0  0.13  0.45
19  key0  row2  item0  col4  0.37  0.70

คำถาม (s)

  1. ทำไมฉันถึงได้รับ ValueError: Index contains duplicate entries, cannot reshape

  2. ฉันจะหมุนได้อย่างไรdfว่าcolค่าเป็นคอลัมน์rowค่าคือดัชนีและค่าเฉลี่ยval0เป็นอย่างไร

    col   col0   col1   col2   col3  col4
    row                                  
    row0  0.77  0.605    NaN  0.860  0.65
    row2  0.13    NaN  0.395  0.500  0.25
    row3   NaN  0.310    NaN  0.545   NaN
    row4   NaN  0.100  0.395  0.760  0.24
  3. ฉันจะหมุนdfเช่นนั้นcolค่าเป็นคอลัมน์rowค่าเป็นดัชนีค่าเฉลี่ยของval0ค่าและค่าที่หายไปคือ0อะไร?

    col   col0   col1   col2   col3  col4
    row                                  
    row0  0.77  0.605  0.000  0.860  0.65
    row2  0.13  0.000  0.395  0.500  0.25
    row3  0.00  0.310  0.000  0.545  0.00
    row4  0.00  0.100  0.395  0.760  0.24
  4. ฉันจะได้อะไรที่นอกเหนือจากmeanอย่างนั้นได้sumไหม

    col   col0  col1  col2  col3  col4
    row                               
    row0  0.77  1.21  0.00  0.86  0.65
    row2  0.13  0.00  0.79  0.50  0.50
    row3  0.00  0.31  0.00  1.09  0.00
    row4  0.00  0.10  0.79  1.52  0.24
  5. ฉันสามารถทำได้มากกว่าหนึ่งครั้งในคราวเดียว

           sum                          mean                           
    col   col0  col1  col2  col3  col4  col0   col1   col2   col3  col4
    row                                                                
    row0  0.77  1.21  0.00  0.86  0.65  0.77  0.605  0.000  0.860  0.65
    row2  0.13  0.00  0.79  0.50  0.50  0.13  0.000  0.395  0.500  0.25
    row3  0.00  0.31  0.00  1.09  0.00  0.00  0.310  0.000  0.545  0.00
    row4  0.00  0.10  0.79  1.52  0.24  0.00  0.100  0.395  0.760  0.24
  6. ฉันสามารถรวมคอลัมน์ค่าหลายคอลัมน์ได้หรือไม่

          val0                             val1                          
    col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
    row                                                                  
    row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
    row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
    row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
    row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
  7. สามารถแบ่งย่อยหลายคอลัมน์ได้หรือไม่?

    item item0             item1                         item2                   
    col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
    row                                                                          
    row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
    row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
    row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
    row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
  8. หรือ

    item      item0             item1                         item2                  
    col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
    key  row                                                                         
    key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
         row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
         row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
         row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
    key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
         row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
         row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
         row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
    key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
         row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
         row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
  9. ฉันสามารถรวบรวมความถี่ที่คอลัมน์และแถวเกิดขึ้นพร้อมกันหรือที่เรียกว่า "การจัดตารางไขว้" ได้หรือไม่?

    col   col0  col1  col2  col3  col4
    row                               
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
  10. ฉันจะแปลง DataFrame จากยาวเป็นกว้างได้อย่างไรโดยหมุนเพียงสองคอลัมน์ ป.ร. ให้ไว้

    np.random.seed([3, 1415])
    df2 = pd.DataFrame({'A': list('aaaabbbc'), 'B': np.random.choice(15, 8)})        
    df2        
       A   B
    0  a   0
    1  a  11
    2  a   2
    3  a  11
    4  b  10
    5  b  10
    6  b  14
    7  c   7

    คาดว่าควรมีลักษณะเช่น

          a     b    c
    0   0.0  10.0  7.0
    1  11.0  10.0  NaN
    2   2.0  14.0  NaN
    3  11.0   NaN  NaN
  11. ฉันจะแบนดัชนีหลายดัชนีให้เป็นดัชนีเดียวได้อย่างไร pivot

    จาก

       1  2   
       1  1  2        
    a  2  1  1
    b  2  1  0
    c  1  0  0

    ถึง

       1|1  2|1  2|2               
    a    2    1    1
    b    2    1    0
    c    1    0    0

คำตอบ:


302

เราเริ่มต้นด้วยการตอบคำถามแรก:

คำถามที่ 1

ทำไมฉันถึงได้รับ ValueError: Index contains duplicate entries, cannot reshape

สิ่งนี้เกิดขึ้นเนื่องจากแพนด้าพยายามทำดัชนีใหม่อีกครั้งcolumnsหรือindexวัตถุที่มีรายการซ้ำกัน มีวิธีการที่แตกต่างกันในการใช้ที่สามารถทำการหมุนได้ บางส่วนของพวกเขาไม่เหมาะเมื่อมีการซ้ำกันของคีย์ที่มีการขอให้หมุน ตัวอย่างเช่น. pd.DataFrame.pivotพิจารณา ฉันรู้ว่ามีรายการที่ซ้ำกันซึ่งแบ่งปันrowและcolค่า:

df.duplicated(['row', 'col']).any()

True

ดังนั้นเมื่อฉันpivotใช้

df.pivot(index='row', columns='col', values='val0')

ฉันได้รับข้อผิดพลาดดังกล่าวข้างต้น ที่จริงแล้วฉันได้รับข้อผิดพลาดเดียวกันเมื่อฉันพยายามทำงานเดียวกันด้วย:

df.set_index(['row', 'col'])['val0'].unstack()

นี่คือรายการของสำนวนที่เราสามารถใช้ในการหมุน

  1. pd.DataFrame.groupby + pd.DataFrame.unstack
    • วิธีการทั่วไปที่ดีสำหรับการทำ pivot ทุกประเภท
    • คุณระบุคอลัมน์ทั้งหมดที่จะประกอบเป็นระดับแถวและระดับคอลัมน์ที่ถูกหมุนในหนึ่งกลุ่มโดย คุณทำตามนั้นโดยการเลือกคอลัมน์ที่เหลือที่คุณต้องการรวมและฟังก์ชันที่คุณต้องการรวม สุดท้ายคุณunstackคือระดับที่คุณต้องการให้อยู่ในดัชนีคอลัมน์
  2. pd.DataFrame.pivot_table
    • เวอร์ชันที่น่ายกย่องgroupbyด้วย API ที่ใช้งานง่ายกว่า สำหรับหลาย ๆ คนนี่เป็นวิธีการที่แนะนำ และเป็นแนวทางที่ผู้พัฒนาตั้งใจไว้
    • ระบุระดับแถวระดับคอลัมน์ค่าที่จะรวมและฟังก์ชันเพื่อดำเนินการรวม
  3. pd.DataFrame.set_index + pd.DataFrame.unstack
    • สะดวกและใช้งานง่ายสำหรับบางคน (รวมตัวเอง) ไม่สามารถจัดการกับคีย์ที่จัดกลุ่มซ้ำกันได้
    • เช่นเดียวกับgroupbyกระบวนทัศน์เราระบุคอลัมน์ทั้งหมดที่จะเป็นระดับแถวหรือคอลัมน์ในที่สุดและตั้งค่าให้เป็นดัชนี จากนั้นเราก็unstackเป็นระดับที่เราต้องการในคอลัมน์ หากระดับดัชนีที่เหลืออยู่หรือระดับคอลัมน์นั้นไม่ซ้ำกันวิธีนี้จะล้มเหลว
  4. pd.DataFrame.pivot
    • คล้ายกันมากกับการset_indexที่มันแชร์ข้อ จำกัด คีย์ที่ซ้ำกัน API มีข้อ จำกัด เช่นกัน มันใช้เวลาเพียงค่าสเกลาสำหรับindex, ,columnsvalues
    • เช่นเดียวกับpivot_tableวิธีการที่เราเลือกแถวคอลัมน์และค่าที่จะเปลี่ยน อย่างไรก็ตามเราไม่สามารถรวมกันได้และหากแถวหรือคอลัมน์ใดคอลัมน์หนึ่งไม่ซ้ำกันวิธีนี้จะล้มเหลว
  5. pd.crosstab
    • นี่เป็นรุ่นพิเศษpivot_tableและในรูปแบบบริสุทธิ์เป็นวิธีที่ง่ายที่สุดในการทำงานหลายอย่าง
  6. pd.factorize + np.bincount
    • นี่เป็นเทคนิคขั้นสูงที่ไม่ชัดเจน แต่เร็วมาก ไม่สามารถใช้ได้ในทุกสถานการณ์ แต่เมื่อสามารถใช้งานได้และคุณใช้งานได้อย่างสะดวกคุณจะได้รับรางวัลประสิทธิภาพการทำงาน
  7. pd.get_dummies + pd.DataFrame.dot
    • ฉันใช้สิ่งนี้ในการทำ cross tabulation อย่างชาญฉลาด

ตัวอย่าง

pd.DataFrame.pivot_tableสิ่งที่ฉันจะทำสำหรับแต่ละคำตอบที่ตามมาและเป็นคำถามที่จะตอบได้โดยใช้ จากนั้นฉันจะให้ทางเลือกอื่นในการทำงานเดียวกัน

คำถามที่ 3

ฉันจะหมุนdfเช่นนั้นcolค่าเป็นคอลัมน์rowค่าเป็นดัชนีค่าเฉลี่ยของval0ค่าและค่าที่หายไปคือ0อะไร?

  • pd.DataFrame.pivot_table

    • fill_valueไม่ได้ตั้งค่าเริ่มต้น ฉันมักจะตั้งมันอย่างเหมาะสม 0ในกรณีนี้ผมตั้งค่าให้ สังเกตุฉันข้ามคำถาม 2เหมือนกันกับคำตอบนี้โดยไม่มีfill_value
    • aggfunc='mean'เป็นค่าเริ่มต้นและฉันไม่ต้องตั้งค่า ฉันรวมไว้เพื่อให้ชัดเจน

      df.pivot_table(
          values='val0', index='row', columns='col',
          fill_value=0, aggfunc='mean')
      
      col   col0   col1   col2   col3  col4
      row                                  
      row0  0.77  0.605  0.000  0.860  0.65
      row2  0.13  0.000  0.395  0.500  0.25
      row3  0.00  0.310  0.000  0.545  0.00
      row4  0.00  0.100  0.395  0.760  0.24
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].mean().unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='mean').fillna(0)

คำถามที่ 4

ฉันจะได้อะไรที่นอกเหนือจากmeanอย่างนั้นได้sumไหม

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc='sum')
    
    col   col0  col1  col2  col3  col4
    row                               
    row0  0.77  1.21  0.00  0.86  0.65
    row2  0.13  0.00  0.79  0.50  0.50
    row3  0.00  0.31  0.00  1.09  0.00
    row4  0.00  0.10  0.79  1.52  0.24
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].sum().unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='sum').fillna(0)

คำถามที่ 5

ฉันสามารถทำได้มากกว่าหนึ่งครั้งในคราวเดียว

โปรดสังเกตว่าสำหรับpivot_tableและcrosstabฉันจำเป็นต้องส่งรายการ callables ในทางกลับกันgroupby.aggสามารถใช้สตริงสำหรับฟังก์ชันพิเศษจำนวน จำกัด groupby.aggก็จะมี callables เดียวกันกับที่เราส่งให้คนอื่น ๆ แต่มักจะมีประสิทธิภาพมากกว่าในการใช้ประโยชน์จากชื่อฟังก์ชันสตริงเนื่องจากมีประสิทธิภาพที่จะได้รับ

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc=[np.size, np.mean])
    
         size                      mean                           
    col  col0 col1 col2 col3 col4  col0   col1   col2   col3  col4
    row                                                           
    row0    1    2    0    1    1  0.77  0.605  0.000  0.860  0.65
    row2    1    0    2    1    2  0.13  0.000  0.395  0.500  0.25
    row3    0    1    0    2    0  0.00  0.310  0.000  0.545  0.00
    row4    0    1    2    2    1  0.00  0.100  0.395  0.760  0.24
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].agg(['size', 'mean']).unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc=[np.size, np.mean]).fillna(0, downcast='infer')

คำถามที่ 6

ฉันสามารถรวมคอลัมน์ค่าหลายคอลัมน์ได้หรือไม่

  • pd.DataFrame.pivot_tableเราผ่านvalues=['val0', 'val1']แต่เราสามารถทิ้งมันไว้อย่างสมบูรณ์

    df.pivot_table(
        values=['val0', 'val1'], index='row', columns='col',
        fill_value=0, aggfunc='mean')
    
          val0                             val1                          
    col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
    row                                                                  
    row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
    row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
    row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
    row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0', 'val1'].mean().unstack(fill_value=0)

คำถามที่ 7

สามารถแบ่งย่อยหลายคอลัมน์ได้หรือไม่?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item item0             item1                         item2                   
    col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
    row                                                                          
    row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
    row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
    row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
    row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
  • pd.DataFrame.groupby

    df.groupby(
        ['row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)

คำถามที่ 8

สามารถแบ่งย่อยหลายคอลัมน์ได้หรือไม่?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index=['key', 'row'], columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item      item0             item1                         item2                  
    col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
    key  row                                                                         
    key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
         row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
         row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
         row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
    key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
         row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
         row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
         row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
    key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
         row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
         row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
  • pd.DataFrame.groupby

    df.groupby(
        ['key', 'row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
  • pd.DataFrame.set_index เนื่องจากชุดของคีย์นั้นไม่เหมือนกันสำหรับทั้งแถวและคอลัมน์

    df.set_index(
        ['key', 'row', 'item', 'col']
    )['val0'].unstack(['item', 'col']).fillna(0).sort_index(1)

คำถามที่ 9

ฉันสามารถรวบรวมความถี่ที่คอลัมน์และแถวเกิดขึ้นพร้อมกันหรือที่เรียกว่า "การจัดตารางไขว้" ได้หรือไม่?

  • pd.DataFrame.pivot_table

    df.pivot_table(index='row', columns='col', fill_value=0, aggfunc='size')
    
        col   col0  col1  col2  col3  col4
    row                               
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].size().unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(df['row'], df['col'])
  • pd.factorize + np.bincount

    # get integer factorization `i` and unique values `r`
    # for column `'row'`
    i, r = pd.factorize(df['row'].values)
    # get integer factorization `j` and unique values `c`
    # for column `'col'`
    j, c = pd.factorize(df['col'].values)
    # `n` will be the number of rows
    # `m` will be the number of columns
    n, m = r.size, c.size
    # `i * m + j` is a clever way of counting the 
    # factorization bins assuming a flat array of length
    # `n * m`.  Which is why we subsequently reshape as `(n, m)`
    b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)
    # BTW, whenever I read this, I think 'Bean, Rice, and Cheese'
    pd.DataFrame(b, r, c)
    
          col3  col2  col0  col1  col4
    row3     2     0     0     1     0
    row2     1     2     1     0     2
    row0     1     0     1     2     1
    row4     2     2     0     1     1
  • pd.get_dummies

    pd.get_dummies(df['row']).T.dot(pd.get_dummies(df['col']))
    
          col0  col1  col2  col3  col4
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1

คำถามที่ 10

ฉันจะแปลง DataFrame จากยาวเป็นกว้างได้อย่างไรโดยหมุนเพียงสองคอลัมน์

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

df2.insert(0, 'count', df.groupby('A').cumcount())
df2

   count  A   B
0      0  a   0
1      1  a  11
2      2  a   2
3      3  a  11
4      0  b  10
5      1  b  10
6      2  b  14
7      0  c   7

DataFrame.pivotขั้นตอนที่สองคือการใช้คอลัมน์ที่สร้างขึ้นใหม่เป็นดัชนีที่จะเรียก

df2.pivot(*df)
# df.pivot(index='count', columns='A', values='B')

A         a     b    c
count                 
0       0.0  10.0  7.0
1      11.0  10.0  NaN
2       2.0  14.0  NaN
3      11.0   NaN  NaN

คำถามที่ 11

ฉันจะแบนดัชนีหลายดัชนีให้เป็นดัชนีเดียวได้อย่างไร pivot

ถ้าcolumnsพิมพ์objectด้วยสตริงjoin

df.columns = df.columns.map('|'.join)

อื่น format

df.columns = df.columns.map('{0[0]}|{0[1]}'.format) 

43
คุณช่วยโปรดพิจารณาขยายเอกสารอย่างเป็นทางการได้ไหม
MaxU

เกิดอะไรขึ้นกับคำตอบของคำถาม # 10 KeyError: 'A'ฉันได้รับ มีคำตอบให้มากกว่านี้ไหม?
โมนิก้า Heddneck

@MonicaHeddneck ฉันจะตรวจสอบอีกครั้งและอัปเดตหากจำเป็น อย่างไรก็ตาม'A'สมมติว่ามีคอลัมน์'A'ใน dataframe ของคุณที่จะจัดกลุ่มตาม
piRSquared

ฉันสามารถรวมคอลัมน์ค่าหลายคอลัมน์ได้หรือไม่ คำตอบสำหรับสิ่งนี้จะใช้ได้กับคอลัมน์ที่มีชนิดข้อมูลต่างกัน สำหรับ ex: values ​​= ['val0', 'val1'], ที่นี่ val0 is int และ val1 เป็น string
Anil Kumar

1
ไม่จำเป็นต้องแทรกคอลัมน์ในคำถาม 10 สามารถส่งผ่านโดยตรงเป็นอาร์กิวเมนต์ในตารางเดือย
ansev

4

หากต้องการขยาย@ piRSquared ให้คำตอบเวอร์ชันอื่นของ 10

คำถามที่ 10.1

DataFrame:

d = data = {'A': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 3, 6: 5},
 'B': {0: 'a', 1: 'b', 2: 'c', 3: 'a', 4: 'b', 5: 'a', 6: 'c'}}
df = pd.DataFrame(d)

   A  B
0  1  a
1  1  b
2  1  c
3  2  a
4  2  b
5  3  a
6  5  c

เอาท์พุท:

   0     1     2
A
1  a     b     c
2  a     b  None
3  a  None  None
5  c  None  None

การใช้df.groupbyและpd.Series.tolist

t = df.groupby('A')['B'].apply(list)
out = pd.DataFrame(t.tolist(),index=t.index)
out
   0     1     2
A
1  a     b     c
2  a     b  None
3  a  None  None
5  c  None  None

หรือทางเลือกที่ดีกว่าการใช้pd.pivot_tableกับdf.squeeze.

t = df.pivot_table(index='A',values='B',aggfunc=list).squeeze()
out = pd.DataFrame(t.tolist(),index=t.index)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.