Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีผนวกแถวใหม่เข้ากับ DataFrame โดยใช้เทมเพลตใน Python Pandas


วิธีผนวกแถวใหม่เข้ากับ 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 (การโทรล่าสุดล่าสุด) --------------- -------------------------------------------------- ----------- TypeError Traceback (การโทรล่าสุดล่าสุด) ใน1 # เพิ่มแถวใหม่ (พจนานุกรม) ไปยัง DataFrame โดยใช้วิธี .append ----> 2 players_info.append ({'players':'Daniel Medvedev', 'titles':0})~\anaconda3\lib\site-packages\pandas\core\frame.py in append(self, other, forget_index, Verify_integrity, sort)7046 other =Series(อื่นๆ)7047 ถ้า other.name เป็น None และไม่เพิกเฉยต่อดัชนี:-> 7048 ให้เพิ่ม TypeError(7049 "สามารถผนวกซีรี่ส์ได้เฉพาะในกรณีที่เพิกเฉย_index=True "7050 "หรือถ้าซีรีส์มีชื่อ"

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}