Thep Excel

pandas read_csvโหลดไฟล์ CSV เข้า DataFrame

read_csv ใน pandas ผมใช้สำหรับโหลดข้อมูลจากไฟล์ CSV หรือ text ที่มีตัวคั่นเข้ามาเป็น DataFrame พร้อมใช้งาน ถ้าใครเคยเปิดไฟล์ CSV ใน Excel แล้วได้ตารางให้แก้งานต่อ read_csv ก็คือสิ่งเดียวกันเลยครับแต่สำหรับ Python

>_
pd.read_csv(filepath_or_buffer, sep, usecols, nrows, dtype)

ความนิยม5/10
ความยาก3/10
ประโยชน์5/10

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่าDataFrame

คืนเป็น DataFrame ที่พร้อมใช้งานทันทีครับ ต่อด้วย method ต่างๆ ได้เลย เช่น .head(), .describe(), .groupby() ฯลฯ

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
filepath_or_buffer str | Path | file-like path ของไฟล์ CSV, URL, หรือ file-like object เช่น StringIO ก็ได้ครับ
[sep]ไม่บังคับ str ',' ตัวคั่นระหว่างคอลัมน์ ค่าเริ่มต้นคือ comma (,) แต่ถ้าไฟล์คั่นด้วย tab ให้ใส่ sep=’\t’ ครับ
[usecols]ไม่บังคับ list | callable None ระบุชื่อหรือ index คอลัมน์ที่อยากโหลด เช่น [‘name’, ‘age’] ไม่โหลดทุกคอลัมน์ให้สิ้นเปลือง RAM
[nrows]ไม่บังคับ int None จำกัดจำนวนแถวที่โหลด เช่น nrows=100 เอาแค่ 100 แถวแรก ใช้ตอน preview ไฟล์ใหญ่ก่อนโหลดจริงครับ
[dtype]ไม่บังคับ dict | str None กำหนด type ของคอลัมน์เลย เช่น {‘age’: int, ‘code’: str} ป้องกัน pandas เดา type ผิด
[header]ไม่บังคับ int | list | None 'infer' บอกว่าแถวไหนเป็น header ค่าเริ่มต้นคือแถว 0 ถ้าไม่มี header ให้ใส่ header=None ครับ
[index_col]ไม่บังคับ int | str | list | False None คอลัมน์ที่ใช้เป็น index ของ DataFrame เช่น index_col=’id’ หรือ index_col=0

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

read_csv คือจุดเริ่มต้นของงาน data analysis ส่วนใหญ่ที่ผมทำครับ มันอ่านไฟล์ CSV (หรือข้อความที่คั่นด้วยอักขระใดก็ได้) แล้วแปลงให้เป็น DataFrame ที่พร้อมวิเคราะห์ต่อได้ทันที ไม่ต้องเขียน parser เองให้ยุ่งยาก

จุดที่ทำให้ read_csv ทรงพลังคือ argument ที่ปรับได้เยอะมากครับ ตั้งแต่บอกว่าตัวคั่นคืออะไร (sep), โหลดแค่บางคอลัมน์ (usecols), จำกัดจำนวนแถว (nrows), กำหนด type ของแต่ละคอลัมน์ (dtype), ไปจนถึงบอกว่าค่าไหนหมายถึง null ครับ

ที่เจ๋งคือ read_csv รับได้ทั้ง path ไฟล์จริง, URL, และ file-like object เช่น StringIO ทำให้ผมเทสโค้ดได้โดยไม่ต้องมีไฟล์จริงบนเครื่องเลย ✨

ส่วนตัวผมชอบใช้ usecols กับ dtype ตั้งแต่ตอน read เลยครับ ไฟล์ใหญ่ๆ โหลดแค่คอลัมน์ที่ต้องการกับกำหนด type ให้ถูกต้องตั้งแต่แรก เร็วและประหยัด RAM กว่าโหลดทุกคอลัมน์แล้วค่อยจัดทีหลังเยอะมาก 😎

Examples

ตัวอย่างที่ 1: โหลด CSV พื้นฐานpd.read_csv(StringIO(csv_text))

ผมโหลด CSV จาก StringIO แทนไฟล์จริงครับ ได้ DataFrame 2 แถว 2 คอลัมน์ทันที ใช้ StringIO แบบนี้ตอนเทสโค้ดได้เลยโดยไม่ต้องมีไฟล์บนเครื่อง เหมือนกับที่เราเปิดไฟล์ CSV ใน Excel แล้วได้ตาราง พร้อมทำงานต่อได้เลยครับ

>_
pd.read_csv(StringIO(csv_text))

ผลลัพธ์ name age
0 Ann 30
1 Bob 25
ตัวอย่างที่ 2: เลือกโหลดแค่บางคอลัมน์ด้วย usecolspd.read_csv(StringIO(csv_text), usecols=['name', 'salary'])

ผมใช้ usecols บอกว่าอยากได้แค่คอลัมน์ name กับ salary เท่านั้น คอลัมน์ age ถูกข้ามไปเลยครับ เหมือนกับที่เราเลือก Column ใน Power Query ว่าอันไหนจะเอาอันไหนจะตัดทิ้ง ไฟล์ใหญ่โหลดแค่ที่ต้องการ ประหยัด RAM และเร็วกว่าโหลดทั้งหมดแล้วค่อยเลือกทีหลังครับ

>_
pd.read_csv(StringIO(csv_text), usecols=['name', 'salary'])

ผลลัพธ์ name salary
0 Ann 50000
1 Bob 45000
2 Cara 55000
ตัวอย่างที่ 3: จำกัดจำนวนแถวด้วย nrowspd.read_csv(StringIO(csv_text), nrows=3)

ใส่ nrows=3 เพื่อโหลดแค่ 3 แถวแรกครับ ผมใช้ trick นี้บ่อยมากตอนไฟล์ CSV มีล้านแถว แต่อยากลอง preview structure ก่อนว่าข้อมูลหน้าตาเป็นยังไง โหลดแค่นิดเดียวก็รู้แล้วว่าต้องทำอะไรต่อ ประหยัดเวลารอโหลดทั้งไฟล์มากๆ

>_
pd.read_csv(StringIO(csv_text), nrows=3)

ผลลัพธ์ name age
0 Ann 30
1 Bob 25
2 Cara 28
ตัวอย่างที่ 4: กำหนด type คอลัมน์ด้วย dtypepd.read_csv(StringIO(csv_text), dtype={'code': str, 'amount': int})

ผมใช้ dtype บอก pandas ตั้งแต่แรกเลยว่า code ต้องเป็น string (ไม่ใช่ตัวเลข) และ amount เป็น int ครับ ถ้าไม่ระบุ pandas อาจแปลง '001' เป็น 1 ทำให้ zero นำหน้าหายไป ซึ่งพังแน่ถ้าเป็นรหัสสินค้าหรือรหัสไปรษณีย์ กำหนด dtype ตั้งแต่ต้นป้องกัน bug แบบนี้ได้ดีครับ

>_
pd.read_csv(StringIO(csv_text), dtype={'code': str, 'amount': int})

ผลลัพธ์ code amount
0 001 100
1 002 200
2 003 300

FAQs

ต่างจากการเปิดไฟล์ด้วย open() ธรรมดายังไงครับ?+

ต่างกันมากเลยครับ ถ้าใช้ open() เราได้แค่ raw text ต้องเขียน code แปลงเองทุกอย่าง ตั้งแต่แยกแถว แยกคอลัมน์ แปลง type ฯลฯ แต่ read_csv ทำทุกอย่างให้เลย ได้ DataFrame พร้อมใช้ทันที ผมไม่เคย parse CSV ด้วย open() เองอีกแล้วตั้งแต่รู้จัก pandas ครับ

ไฟล์ CSV ภาษาไทย encoding ผิด อ่านแล้วเป็น ??? ทำยังไงดี?+

ระบุ encoding='utf-8' หรือ encoding='cp874' (Thai Windows) ครับ เช่น pd.read_csv('file.csv', encoding='cp874') ไฟล์ที่ export จาก Excel หรือระบบไทยเก่าๆ มักเป็น cp874 (TIS-620) ส่วนไฟล์สมัยใหม่หรือ export จาก Google Sheets มักเป็น UTF-8 ลองสลับดูครับ ถ้าไม่แน่ใจลอง 'utf-8-sig' ก็ได้ครับ มันจัดการ BOM header ของ Windows ให้ด้วย

โหลดไฟล์ใหญ่มากๆ หลาย GB RAM ไม่พอทำยังไง?+

ใช้ chunksize ครับ เช่น pd.read_csv('big.csv', chunksize=10000) แล้วประมวลผลทีละ chunk ผมใช้แบบนี้ตอนไฟล์ใหญ่เกิน RAM ได้เลย อีกวิธีคือใช้ usecols โหลดแค่คอลัมน์ที่ต้องการกับ dtype ให้ถูกต้องตั้งแต่แรก ก็ช่วยลด RAM ไปได้เยอะครับ

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas read_csv จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้pandas read_csvIO
IO (2)
pandas read_excel

read_excel ใน pandas ผมใช้สำหรับโหลดข้อมูลจากไฟล์ .xlsx หรือ .xls เข้ามาเป็น DataFrame เพื่อวิเคราะห์ต่อใน Python ถ้าเคยเปิดไฟล์ Excel แล้วก็อปข้อมูลไปทำงานต่อ ตัวนี้ทำแบบเดียวกันแต่อัตโนมัติเลยครับ

pandas to_csv

to_csv ใน pandas ผมใช้สำหรับส่งออกข้อมูลใน DataFrame ให้เป็น CSV ไม่ว่าจะเซฟเป็นไฟล์หรือแปลงเป็น string ก็ทำได้ครับ เหมือนกับการกด Save As → CSV ใน Excel แต่ทำผ่านโค้ดได้เลย

Creation (1)
pd.DataFrame

pd.DataFrame คือคำสั่งสร้างตาราง 2 มิติ (แถว × คอลัมน์) ใน pandas ซึ่งผมเทียบได้กับ sheet หรือ range ใน Excel เลยครับ โค้ด Python ที่วิเคราะห์ข้อมูลแทบทุกตัวเริ่มต้นด้วยการสร้าง DataFrame นี่แหละ

Aggregation (1)
pandas describe

df.describe() ใน pandas ผมใช้สำหรับดูสถิติพื้นฐานของข้อมูลในทุกคอลัมน์พร้อมกันในคำสั่งเดียว ทั้ง count, mean, std, min, max และ percentile ช่วยให้เข้าใจภาพรวมของชุดข้อมูลได้เร็วมากก่อนเริ่มวิเคราะห์จริงครับ

Inspection (1)
pandas head

head ใน pandas ผมใช้สำหรับดูข้อมูลแถวแรกๆ ของ DataFrame เพื่อเช็กว่าโหลดข้อมูลมาถูกต้องหรือเปล่า คล้ายกับการ scroll ไปดูบนสุดของตาราง Excel เลยครับ

Selection (1)
pandas query

query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่