คำถามเดิมกล่าวถึงกรณีการใช้งานที่เฉพาะเจาะจง สำหรับผู้ที่ต้องการคำตอบทั่วไปเพิ่มเติมนี่คือตัวอย่างบางส่วน:
การสร้างคอลัมน์ใหม่โดยใช้ข้อมูลจากคอลัมน์อื่น
รับดาต้าเฟรมด้านล่าง:
import pandas as pd
import numpy as np
df = pd.DataFrame([['dog', 'hound', 5],
['cat', 'ragdoll', 1]],
columns=['animal', 'type', 'age'])
In[1]:
Out[1]:
animal type age
----------------------
0 dog hound 5
1 cat ragdoll 1
ด้านล่างนี้เรากำลังเพิ่มdescription
คอลัมน์ใหม่เป็นการเรียงต่อกันของคอลัมน์อื่น ๆ โดยใช้การ+
ดำเนินการที่ถูกแทนที่สำหรับชุดข้อมูล การจัดรูปแบบสตริงแฟนซี, f-strings ฯลฯ จะไม่ทำงานที่นี่เนื่องจาก+
ใช้กับสเกลาร์ไม่ใช่ค่า 'ดั้งเดิม':
df['description'] = 'A ' + df.age.astype(str) + ' years old ' \
+ df.type + ' ' + df.animal
In [2]: df
Out[2]:
animal type age description
-------------------------------------------------
0 dog hound 5 A 5 years old hound dog
1 cat ragdoll 1 A 1 years old ragdoll cat
เราได้รับ1 years
สำหรับแมว (แทน1 year
) ซึ่งเราจะแก้ไขด้านล่างโดยใช้เงื่อนไข
การแก้ไขคอลัมน์ที่มีอยู่ด้วยเงื่อนไข
ที่นี่เรากำลังแทนที่animal
คอลัมน์เดิมด้วยค่าจากคอลัมน์อื่นและใช้np.where
เพื่อตั้งค่าสตริงย่อยตามเงื่อนไขตามค่าของage
:
# append 's' to 'age' if it's greater than 1
df.animal = df.animal + ", " + df.type + ", " + \
df.age.astype(str) + " year" + np.where(df.age > 1, 's', '')
In [3]: df
Out[3]:
animal type age
-------------------------------------
0 dog, hound, 5 years hound 5
1 cat, ragdoll, 1 year ragdoll 1
การแก้ไขหลายคอลัมน์ด้วยเงื่อนไข
วิธีการที่ยืดหยุ่นกว่าคือการเรียก.apply()
ใช้ดาต้าเฟรมทั้งหมดแทนที่จะอยู่ในคอลัมน์เดียว:
def transform_row(r):
r.animal = 'wild ' + r.type
r.type = r.animal + ' creature'
r.age = "{} year{}".format(r.age, r.age > 1 and 's' or '')
return r
df.apply(transform_row, axis=1)
In[4]:
Out[4]:
animal type age
----------------------------------------
0 wild hound dog creature 5 years
1 wild ragdoll cat creature 1 year
ในโค้ดด้านบนtransform_row(r)
ฟังก์ชันจะใช้Series
วัตถุที่เป็นตัวแทนของแถวที่กำหนด (ระบุโดยaxis=1
ค่าเริ่มต้นของaxis=0
จะระบุSeries
อ็อบเจ็กต์สำหรับแต่ละคอลัมน์) สิ่งนี้ช่วยลดความยุ่งยากในการประมวลผลเนื่องจากเราสามารถเข้าถึงค่า 'ดั้งเดิม' จริงในแถวโดยใช้ชื่อคอลัมน์และสามารถมองเห็นเซลล์อื่นในแถว / คอลัมน์ที่กำหนดได้
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'