การกำหนดคอลัมน์สุดง่าย
dataframe นุ่นถูกนำมาใช้เป็น dict สั่งของคอลัมน์
ซึ่งหมายความว่า__getitem__
[]
ไม่สามารถใช้เพื่อรับคอลัมน์บางคอลัมน์เท่านั้นได้__setitem__
[] =
สามารถใช้เพื่อกำหนดคอลัมน์ใหม่ได้
ตัวอย่างเช่น dataframe นี้สามารถเพิ่มคอลัมน์โดยใช้[]
accessor
size name color
0 big rose red
1 small violet blue
2 small tulip red
3 small harebell blue
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
โปรดทราบว่าสิ่งนี้ใช้ได้แม้ว่าดัชนีของ dataframe จะปิดอยู่
df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
[] = เป็นหนทางไป แต่ระวัง!
อย่างไรก็ตามหากคุณมี a pd.Series
และพยายามที่จะกำหนดให้กับ dataframe ที่ดัชนีปิดคุณจะพบปัญหา ดูตัวอย่าง:
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
นี่คือเนื่องจากpd.Series
โดยค่าเริ่มต้นมีดัชนีที่ระบุจาก 0 ถึง n และ[] =
วิธีการของแพนด้าก็พยายาม ที่จะ "ฉลาด"
สิ่งที่เกิดขึ้นจริง
เมื่อคุณใช้[] =
วิธีการแพนด้าดำเนินการเข้าร่วมด้านนอกหรือผสานภายนอกอย่างเงียบ ๆ โดยใช้ดัชนีของดาต้าเฟรมซ้ายและดัชนีของซีรีย์ขวามือdf['column'] = series
ข้อความด้านข้าง
สิ่งนี้ทำให้เกิดความไม่ลงรอยกันขององค์ความรู้อย่างรวดเร็วเนื่องจาก[]=
วิธีการพยายามทำสิ่งต่าง ๆ มากมายขึ้นอยู่กับอินพุตและผลลัพธ์ไม่สามารถคาดการณ์ได้จนกว่าคุณจะรู้ว่าแพนด้าทำงานอย่างไร ฉันจะให้คำแนะนำกับ[]=
ในฐานรหัส แต่เมื่อสำรวจข้อมูลในโน้ตบุ๊กก็ดี
การแก้ไขปัญหา
หากคุณมีpd.Series
และต้องการให้มันได้รับมอบหมายจากบนลงล่างหรือถ้าคุณกำลังเขียนโค้ดที่มีประสิทธิผลและคุณไม่แน่ใจในคำสั่งดัชนีมันคุ้มค่าที่จะป้องกันปัญหาประเภทนี้
คุณสามารถ downcast pd.Series
ไปที่ a np.ndarray
หรือสิ่งlist
นี้จะทำเคล็ดลับ
df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values
หรือ
df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))
แต่นี่ไม่ชัดเจนมาก
ผู้เขียนโค้ดบางคนอาจเข้ามาและพูดว่า "เฮ้นี่ดูซ้ำซ้อนฉันจะทำให้มันหายไป"
วิธีที่ชัดเจน
การตั้งค่าดัชนีของpd.Series
เป็นดัชนีของdf
ชัดเจน
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)
หรือมากกว่าความเป็นจริงคุณอาจมีpd.Series
อยู่แล้ว
protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index
3 no
2 no
1 no
0 yes
สามารถกำหนดได้แล้ว
df['protected'] = protected_series
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
ทางเลือกด้วย df.reset_index()
เนื่องจากความไม่สอดคล้องกันของดัชนีเป็นปัญหาหากคุณรู้สึกว่าดัชนีของ dataframe ไม่ควรกำหนดสิ่งต่าง ๆ คุณสามารถวางดัชนีได้สิ่งนี้น่าจะเร็วกว่า แต่ก็ไม่สะอาดมากเพราะฟังก์ชั่นของคุณอาจทำสองสิ่ง
df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
หมายเหตุเกี่ยวกับ df.assign
ในขณะที่df.assign
ทำให้ชัดเจนยิ่งขึ้นในสิ่งที่คุณกำลังทำ แต่จริงๆแล้วมันมีปัญหาเช่นเดียวกับข้างต้น[]=
df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
เพียงแค่ดูออกมาพร้อมกับที่คอลัมน์ของคุณไม่ได้เรียกว่าdf.assign
self
มันจะทำให้เกิดข้อผิดพลาด สิ่งนี้ทำให้df.assign
มีกลิ่นเนื่องจากมีสิ่งประดิษฐ์ประเภทนี้ในฟังก์ชั่น
df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'
คุณอาจพูดว่า "เอาล่ะฉันจะไม่ใช้self
แล้ว" แต่ใครจะรู้ว่าฟังก์ชั่นนี้จะเปลี่ยนไปในอนาคตเพื่อรองรับข้อโต้แย้งใหม่ บางทีชื่อคอลัมน์ของคุณอาจเป็นข้อโต้แย้งในการอัพเดทใหม่ของนุ่นทำให้เกิดปัญหากับการอัพเกรด