ปลั๊กอินสำหรับไพธอน:Pandas pivot โต๊ะสำหรับหลายคอลัมน์ที่ครั้งนึงซึ่งมีค่าต่างๆที่ซ้ำกัน

0

คำถาม

มี pandas dataframme กับคอลัมน์ชื่อของโรงเรียนและรอย

name  school  marks

tom     HBS     55
tom     HBS     55
tom     HBS     14
mark    HBS     28
mark    HBS     19
lewis   HBS     88

ยังไงเพื่อเปลี่ยนตำแหน่งแล้วแปลงเป็นแบบนี้

name  school  marks_1 marks_2 marks_3

tom     HBS     55     55       14
mark    HBS     28     19
lewis   HBS     88

พยายามนี้:

df = df.pivot_table(index='name', values='marks', columns='school') \
    .reset_index() \
    .rename_axis(None, axis=1)

print(df)
df = df.pivot('name','marks','school')

กาเลือกที่อยู่เชื่อมโยงพวกนี้

https://stackoverflow.com/questions/22798934/pandas-long-to-wide-reshape-by-two-variables
https://stackoverflow.com/questions/62391419/pandas-group-by-and-convert-rows-into-multiple-columns
https://stackoverflow.com/questions/60698109/pandas-multiple-rows-to-single-row-with-multiple-columns-on-2-indexes

ได้ข้อผิดพลาดนี้เนื่องจากที่ซ้ำกันออกค่า. วิธีที่จะจัดการหากที่ซ้ำกันอยู่ก่อนแล้วเราต้องให้พวกเขา

ValueError: Index contains duplicate entries, cannot reshape
dataframe group-by pandas pivot
2021-11-23 02:17:12
2

คำตอบที่ดีที่สุด

2

ลองใช้ set_index แล้ว unstack กับ groupby แล้ว cumcount:

df_out = df.set_index(['name',
                       'school',
                       df.groupby(['name','school'])\
           .cumcount() +1]).unstack()
df_out.columns = [f'{i}_{j}' for i, j in df_out.columns]
df_out = df_out.reset_index()
df_out

แสดงผล:

    name school  marks_1  marks_2  marks_3
0  lewis    HBS     88.0      NaN      NaN
1   mark    HBS     28.0     19.0      NaN
2    tom    HBS     55.0     55.0     14.0
2021-11-23 02:27:52
1

คน cumcount ฟังก์ชันจะอนุญาตให้คนที่จะสร้างพิเศษ indices ก่อนที่ pivoting. นี่สิ่งเดียวกันความคิดที่@ScottBoston อย่างไรก็ตามที่ pivot ฟังก์ชันนี้จะถูกใช้อยู่:

index = ['name', 'school']

                  # create an extra column for uniqueness          
temp = (df.assign(counter = df.groupby(index)
                              .cumcount()
                              .add(1)
                              .astype(str))
          .pivot(index = index, columns = 'counter')
        )

# flatten the columns
temp.columns = temp.columns.map('_'.join)

temp.reset_index()

    name school  marks_1  marks_2  marks_3
0  lewis    HBS     88.0      NaN      NaN
1   mark    HBS     28.0     19.0      NaN
2    tom    HBS     55.0     55.0     14.0

อีกทางเลือกคุณสามารถใช้ pivot_wider ฟังก์ชันจาก pyjanitorซึ่งเป็น syntactic น้ำตาลทั่ว pd.pivotกับผู้ช่วยหน่อ:

# pip install pyjanitor
import pandas as pd
import janitor
(df.assign(counter = df.groupby(index)
                       .cumcount()
                       .add(1))                              
   .pivot_wider(index = index, 
                names_from = 'counter', 
                names_sep = '_')
)

    name school  marks_1  marks_2  marks_3
0  lewis    HBS     88.0      NaN      NaN
1   mark    HBS     28.0     19.0      NaN
2    tom    HBS     55.0     55.0     14.0
2021-11-23 03:14:53

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่