วิธีผนวกแถวใหม่เข้ากับ DataFrame โดยใช้เทมเพลตใน Python Pandas
แนะนำตัว
การเป็นผู้เชี่ยวชาญด้านวิศวกรรมข้อมูล ฉันมักจะจบลงด้วยการสร้างคอลัมน์ที่ได้รับมากกว่าแถว เนื่องจากบทบาทของการสร้างและส่งข้อมูลให้ฉันสำหรับการวิเคราะห์ควรได้รับการดูแลจากผู้เชี่ยวชาญด้านฐานข้อมูลอื่นๆ อย่างไรก็ตามไม่เป็นความจริงตลอดเวลา
เราต้องสร้างแถวตัวอย่างแทนที่จะรอให้ทีมผู้เชี่ยวชาญด้านข้อมูลส่งข้อมูลมาให้เรา ในหัวข้อนี้ผมจะแสดงทริคง่ายๆ ในการสร้างแถว
ทำอย่างไร..
ในสูตรนี้ เราจะเริ่มต้นด้วยการผนวกแถวเข้ากับชุดข้อมูลขนาดเล็กที่มีแอตทริบิวต์ .loc จากนั้นจะใช้วิธี .append
1.ให้เราเริ่มต้นด้วยการสร้าง dataframe เพื่อเพิ่มแถวในภายหลัง
ตัวอย่าง
นำเข้าแพนด้าเป็น pdimport numpy เป็น npplayers_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"])
ผลลัพธ์
พิมพ์(players_info.info())
ตัวอย่าง
RangeIndex:4 รายการ, 0 ถึง 3 คอลัมน์ข้อมูล (ทั้งหมด 2 คอลัมน์):# คอลัมน์ Non-Null Count Dtype--- ------ ---- ---------- -----0 ผู้เล่น 4 วัตถุที่ไม่ใช่ค่าว่าง 1 ชื่อ 4 int64dtypes ที่ไม่ใช่ค่าว่าง:int64 (1) วัตถุ (1) การใช้หน่วยความจำ:192.0+ ไบต์ไม่มี
1. ตอนนี้ให้เราเพิ่มผู้เล่นใหม่ "Dominic Theim" ลงใน dataframe โดยใช้แอตทริบิวต์ .loc
new_Player =['Dominic Theim', 1]players_info.loc[4] =new_Player
ผลลัพธ์
พิมพ์(players_info)
ตำแหน่งผู้เล่น0 Roger Federer 201 Rafael Nadal 202 Novak Djokovic 173 Andy Murray 34 Dominic Theim 1
1. ใช้แอตทริบิวต์ .loc เดียวกัน ให้เราเพิ่มแถวใหม่ต่อท้าย dataframe ที่นี่ฉันจะแสดงวิธีเพิ่มพจนานุกรมลงในดาต้าเฟรม
new_player ={'players':'Daniel Medvedev', 'titles':0}players_info.loc[len(players_info)] =new_player
ผลลัพธ์
พิมพ์(players_info)
ตำแหน่งผู้เล่น0 Roger Federer 201 Rafael Nadal 202 Novak Djokovic 173 Andy Murray 34 Dominic Theim 15 Daniel Medvedev 0
1. เรายังเพิ่มชุดแพนด้าที่เก็บข้อมูลลงในดาต้าเฟรมได้
players_info.loc[len(players_info)] =pd.Series({'players':'Andy Zverev', 'titles':0})
ผลลัพธ์
พิมพ์(players_info)
ตำแหน่งผู้เล่น0 Roger Federer 201 Rafael Nadal 202 Novak Djokovic 173 Andy Murray 34 Dominic Theim 15 Daniel Medvedev 06 Andy Zverev 0
บทสรุป
เราได้เพิ่มข้อมูลใน 4 ขั้นตอนข้างต้นโดยใช้วิธี .loc แอตทริบิวต์ .loc ทำการเปลี่ยนแปลง DataFrame ในตำแหน่ง
ในขั้นตอนต่อไป เราจะดูเมธอด .append ซึ่งไม่แก้ไขการเรียก DataFrame แต่จะคืนค่าสำเนาใหม่ของ DataFrame พร้อมแถวต่อท้าย
อาร์กิวเมนต์แรกของ .append ต้องเป็น DataFrame, Series, พจนานุกรม หรือรายการอื่น
ตัวอย่าง
# สร้าง DataFrame ด้วย indexplayers_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"],index=["โรเจอร์", "นาดาล", "โยโควิช", "เมอร์เรย์"])
# เพิ่มแถวใหม่ (พจนานุกรม) ไปยัง DataFrame โดยใช้ .append method.players_info.append({'players':'Daniel Medvedev', 'titles':0})
TypeError สามารถต่อท้าย Series ได้ก็ต่อเมื่อ dissolve_index=True หรือถ้า Series มีชื่อ
เมื่อฉันพยายามผนวกพจนานุกรม มันทำให้เกิดข้อยกเว้นที่ขอให้เราใช้พารามิเตอร์ dissolve_index=True ให้ฉันเพิ่มพารามิเตอร์ที่แนะนำนี้และดูว่ามันทำงานอย่างไร
new_df =players_info.append({'players':'Daniel Medvedev', 'titles':0}, forget_index=True)
ผลลัพธ์
print(f" *** ต้นฉบับพร้อมดัชนี \n {players_info} \n\n\n *** แก้ไขดัชนี \n {new_df}")
*** Original with indexplayers titlesroger Roger Federer 20nadal Rafael Nadal 20djokovic Novak Djokovic 17murray Andy Murray 3*** Modified indexplayers titles0 Roger Federer 201 Rafael Nadal 202 Novak Djokovic 173 Andy Murray 34 Daniel Medvedev 0
คุณสังเกตอะไรจากผลลัพธ์หลังจากที่ฉันใช้พารามิเตอร์ ละเว้น_index=True? ใช่ เมื่อ forget_index ตั้งค่าเป็น True ดัชนีเก่าจะถูกลบออกอย่างสมบูรณ์และแทนที่ด้วย RangeIndex จาก 0 ถึง n-1
เมธอด .append มีประโยชน์มากเมื่อคุณต้องการเพิ่มหลายแถวใน DataFrame ในครั้งเดียว
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])
ผลลัพธ์
พิมพ์(new_df_1)
ผู้เล่นชื่อ Roger Federer 20nadal Rafael Nadal 20djokovic Novak Djokovic 17murray Andy Murray 3zverev Andy Zverev 0theim Dominic Theim 1
ตกลง ตอนนี้คุณได้เห็นข้อมูลพื้นฐานเกี่ยวกับวิธีการเพิ่มแถวแล้ว เราจะเจาะลึกถึงวิธีการเพิ่มแถวบน dataframe ที่มีหลายคอลัมน์
df =pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")
ผลลัพธ์
print(df.info())
ตัวอย่าง
RangeIndex:4803 รายการ, 0 ถึง 4802 คอลัมน์ข้อมูล (ทั้งหมด 12 คอลัมน์):# คอลัมน์ Non-Null Count Dtype--- ------ ---- ---------- -----0 งบประมาณ 4803 ไม่ใช่ค่าว่าง int641 id 4803 ไม่เป็นค่าว่าง int642 original_language 4803 วัตถุที่ไม่ใช่ค่าว่าง 3 original_title 4803 วัตถุที่ไม่ใช่ค่าว่าง 4 ความนิยม 4803 ไม่เป็นค่าว่าง float645 release_date 4802 ไม่ใช่- null object6 รายได้ 4803 non-null int647 รันไทม์ 4801 non-null float648 สถานะ 4803 non-null object9 title 4803 วัตถุที่ไม่ใช่ null10 vote_average 4803 ที่ไม่ใช่ null float6411 vote_count 4803 non-null int64dtypes:float64(3), int64(4), วัตถุ (5)การใช้หน่วยความจำ:450.4+ KBNone
ชุดข้อมูลจาก Google นี้มี 12 คอลัมน์และง่ายต่อการพิมพ์ชื่อคอลัมน์ผิดหรือลืมไปเลยหากคุณป้อนแถวข้อมูลใหม่ด้วยตนเอง แล้วเราจะหลีกเลี่ยงปัญหานี้ได้อย่างไร? มีวิธีอยู่ แค่สร้างเทมเพลตชื่อคอลัมน์
columns_dictionary =df.iloc[0].to_dict()
##### ผลลัพธ์:
พิมพ์(columns_dictionary)
{'budget':237000000, 'id':19995, 'original_language':'en', 'original_title':'Avatar', 'popularity':150.437577, 'release_date':'10/12/2009', 'รายได้':2787965087 'รันไทม์':162.0 'สถานะ':'ปล่อย', 'ชื่อ':'อวาตาร์', 'โหวต_เฉลี่ย':7.2, 'โหวต_count':11800}
ดังนั้น คุณอาจเข้าใจแล้วว่าเราได้นำแถวแรกและแปลงเป็นพจนานุกรมแล้ว ตกลง เราได้คอลัมน์และค่าแล้ว ให้เราล้างค่าเก่าด้วยความเข้าใจพจนานุกรมโดยกำหนดค่าสตริงก่อนหน้าเป็นสตริงว่าง และค่าอื่นๆ ที่ขาดหายไปทั้งหมด
พจนานุกรมนี้สามารถทำหน้าที่เป็นเทมเพลตสำหรับข้อมูลใหม่ใดๆ ที่คุณต้องการป้อน
ตัวอย่าง
import datetimenew_data_dict ={}สำหรับ a, b ใน columns_dictionary.items():if isinstance(b, str):new_data_dict[a] =np.random.choice(list('abcde'))elif isinstance(b, datetime.date):new_data_dict[a] =np.nanelse:new_data_dict[a] =np.nan
ผลลัพธ์
พิมพ์(new_data_dict)
{'budget':nan, 'id':nan, 'original_language':'e', 'original_title':'a', 'popularity':น่าน, 'release_date':'b', 'revenue':น่าน, 'รันไทม์':น่าน, 'สถานะ':'e', 'หัวเรื่อง':'c', 'vote_average':น่าน, 'vote_count':nan}