Unpivot (Wide → Long)
unpivot · rows · any
2026-09-24
กำลังประมวลผล…
unpivot · rows · any
2026-09-24
ตารางที่คนทำไว้อ่านมักเป็นแบบกว้าง คือมีคอลัมน์ ม.ค., ก.พ., มี.ค. เรียงกันไป ซึ่งอ่านง่ายแต่เอาไปทำกราฟหรือ pivot ต่อไม่ได้ เครื่องมือวิเคราะห์เกือบทั้งหมดต้องการข้อมูลแบบยาว คือหนึ่งแถวต่อหนึ่งการสังเกต เทคนิคนี้แปลงจากกว้างเป็นยาวให้
ชื่อ, อายุ, เมือง — การยุบรวมจะทำให้ข้อมูลไม่มีความหมายidColumns คือคอลัมน์ที่ต้องติดไปกับทุกแถวผลลัพธ์ เช่น ชื่อสาขาหรือรหัสสินค้าvalueColumns คือคอลัมน์ที่จะถูกยุบ แต่ละค่ากลายเป็นหนึ่งแถวnameTo (เก็บชื่อคอลัมน์เดิม) และ valueTo (เก็บค่า)dropNulls เพื่อไม่สร้างแถวสำหรับช่องที่ว่าง ซึ่งมักลดขนาดผลลัพธ์ได้มากกับตารางที่มีช่องว่างเยอะ| ก่อน | | | | หลัง | | | |---|---|---|---|---|---|---| | city | jan | feb | → | city | variable | value | | ไทย | 1 | 2 | | ไทย | jan | 1 | | | | | | ไทย | feb | 2 |
import json
def unpivot(rows, id_columns, value_columns, name_to='variable', value_to='value', drop_nulls=False):
result = []
for row in rows:
for column in value_columns:
value = row.get(column)
if drop_nulls and value is None:
continue
entry = {key: row.get(key) for key in id_columns}
entry[name_to] = column
entry[value_to] = value
result.append(entry)
return result
rows = [
{'city': 'ไทย', 'jan': 1, 'feb': None},
{'city': 'Chiang Mai', 'jan': 3, 'feb': 4},
]
print(json.dumps(unpivot(rows, ['city'], ['jan', 'feb']), ensure_ascii=False))
รายงานยอดขายรายสาขามี 12 คอลัมน์เดือนและ 40 สาขา เลือก idColumns เป็น branch และ valueColumns เป็นทั้ง 12 เดือน จะได้ 480 แถว เปิด dropNulls ถ้าสาขาใหม่ยังไม่มียอดในเดือนต้นปี จากนั้นใช้ normalize_date หรือ map_values เพื่อเปลี่ยนชื่อเดือนในคอลัมน์ variable ให้เป็นวันที่จริงก่อนทำกราฟ
ใช้ merge_columns และ split_column สำหรับการจัดรูปแบบระดับคอลัมน์ และใช้ sort_rows เพื่อจัดลำดับผลลัพธ์ให้อ่านง่ายหลังแปลงเป็นแบบยาว