บทนำ
ในงาน Data Engineering บ่อยครั้งต้องสร้างแถวตัวอย่าง (sample rows) เอง แทนที่จะรอทีมฐานข้อมูล สร้าง template จากโครงสร้างคอลัมน์เดิม จะช่วยป้องกันการพิมพ์ชื่อคอลัมน์ผิดหรือลืมคอลัมน์
ขั้นตอนการทำงาน
1. สร้าง DataFrame ตัวอย่าง
import pandas as pd
import numpy as np
players_info = pd.DataFrame(data=[
{"players": "Roger Federer", "titles": 20},
{"players": "Rafael Nadal", "titles": 20},
{"players": "Novak Djokovic", "titles": 17},
{"players": "Andy Murray", "titles": 3}
], columns=["players", "titles"])
2. เพิ่มแถวด้วย .loc (แก้ไข in-place)
# เพิ่มด้วย list
players_info.loc[4] = ['Dominic Theim', 1]
# เพิ่มด้วย dictionary
players_info.loc[len(players_info)] = {'players': 'Daniel Medvedev', 'titles': 0}
# เพิ่มด้วย Series
players_info.loc[len(players_info)] = pd.Series({'players': 'Andy Zverev', 'titles': 0})
.loc แก้ไข DataFrame ตรงๆ
3. เพิ่มแถวด้วย .append (คืน DataFrame ใหม่)
.append ไม่แก้ไข DataFrame ต้นฉบับ คืน copy ใหม่ พารามิเตอร์แรกต้องเป็น DataFrame, Series, dict, หรือ list
# DataFrame พร้อม index แบบกำหนดเอง
players_info = pd.DataFrame(data=[...], columns=["players", "titles"], index=["roger", "nadal", "djokovic", "murray"])
# append dict ต้องใช้ ignore_index=True
new_df = players_info.append({'players': 'Daniel Medvedev', 'titles': 0}, ignore_index=True)
# ignore_index=True → index เดิมหาย กลายเป็น RangeIndex 0..n-1
4. เพิ่มหลายแถวพร้อมกัน
player1 = pd.Series({'players': 'Andy Zverev', 'titles': 0}, name='zverev')
player2 = pd.Series({'players': 'Dominic Theim', 'titles': 1}, name='theim')
new_df_1 = players_info.append([player1, player2])
# index เดิมคงอยู่ (roger, nadal, ...) เพิ่ม zverev, theim ต่อท้าย
5. สร้าง Template สำหรับ DataFrame หลายคอลัมน์
โหลดข้อมูลหนัง 12 คอลัมน์ สร้าง template จากแถวแรก
df = pd.read_csv("movies_data.csv")
columns_dictionary = df.iloc[0].to_dict()
# {'budget': 237000000, 'id': 19995, 'original_language': 'en', ...}
6. ล้างค่าเก่า สร้าง template ใหม่
import datetime
new_data_dict = {}
for a, b in columns_dictionary.items():
if isinstance(b, str):
new_data_dict[a] = np.random.choice(list('abcde')) # random string
elif isinstance(b, datetime.date):
new_data_dict[a] = np.nan
else:
new_data_dict[a] = np.nan
# new_data_dict พร้อมใช้เป็น template เพิ่มแถวใหม่
# {'budget': nan, 'id': nan, 'original_language': 'e', 'original_title': 'a', ...}
สรุป
.locเพิ่มแถว in-place ใช้ index ที่มีอยู่หรือ len(df).appendคืน DataFrame ใหม่ ต้องignore_index=Trueสำหรับ dict- สร้าง template จาก
df.iloc[0].to_dict()แล้วล้างค่า → กัน typo คอลัมน์ และลืมคอลัมน์ - Template เหมาะสำหรับ DataFrame หลายคอลัมน์ (12+ คอลัมน์)