การใช้ iloc เพื่อตั้งค่า [ปิด]


13

บรรทัดนี้ส่งกลับ 4 แถวแรกใน dataframe combinedสำหรับfeature_a

combined.iloc[0:4]["feature_a"]

ตามที่คาดไว้บรรทัดถัดไปนี้จะส่งคืนแถวที่ 2, 4 และ 16 ใน dataframe สำหรับคอลัมน์feature_a:

combined.iloc[[1,3,15]]["feature_a"]

บรรทัดนี้กำหนด 4 แถวแรกใน dataframe สำหรับการfeature_a77

combined.iloc[0:4]["feature_a"] = 77

บรรทัดนี้ทำอะไรบางอย่าง การคำนวณบางอย่างเกิดขึ้นเนื่องจากใช้เวลานานขึ้นเมื่อใช้กับรายการที่ยาวขึ้น

combined.iloc[[1,3,15]]["feature_a"] = 88

แถวที่ 2, 4 และ 16 ไม่ได้ถูกตั้งค่าเป็น88เมื่อตรวจสอบกับสิ่งนี้:

combined.iloc[[1,3,15]]["feature_a"]

ฉันจะตั้งค่ารายการแถวของคอลัมน์ในคอลัมน์ใด ๆ ให้เป็นค่าโดยไม่ต้องมีการเข้ารหัสขนาดใหญ่ได้อย่างไร

สถานการณ์นี้ดูเหมือนว่าควรตรงไปตรงมาและเป็นเรื่องธรรมดา


นี่เป็นคำถามเกี่ยวกับการเขียนโปรแกรมเท่านั้น (ไม่มีสถิติ) และเป็นของStack Overflow
Jake Westfall

หากไม่มีตัวอย่างที่ทำซ้ำได้น้อยที่สุดคำถามประเภทนี้จะไม่อยู่ในหัวข้อ stackoverflow ด้วย
Glen_b

คำตอบ:


24

หากคุณย้อนกลับตัวเลือกและเลือกตามคอลัมน์ก่อนมันจะทำงานได้ดี:

รหัส:

df.feature_a.iloc[[1, 3, 15]] = 88

ทำไม?

เมื่อคุณทำสิ่งแรก (วิธีที่ไม่ทำงาน) คุณกำลังเลือกส่วนที่ไม่ต่อเนื่องกันของ data frame คุณควรได้รับคำเตือน:

ค่ากำลังพยายามตั้งค่าบนสำเนาของชิ้นจาก DataFrame ลองใช้. loc [row_indexer, col_indexer] = ค่าแทน

ดูคำเตือนในเอกสารประกอบ: http://pandas.pydata.org/pandas- > docs / stable / indexing.html # indexing-view-versus-copy

นี่เป็นเพราะมีสองการดำเนินงานที่เป็นอิสระเกิดขึ้น

  1. combined.iloc[[1,3,15]]สร้างดาต้าเฟรมใหม่เพียงสามแถวและจำเป็นต้องคัดลอกเฟรม แล้ว ...
  2. เลือกหนึ่งคอลัมน์ผ่าน["feature_a"]แต่ถูกเลือกเทียบกับสำเนา

ดังนั้นการมอบหมายไปที่การคัดลอก มีหลายวิธีในการแก้ไขปัญหานี้ แต่ในกรณีนี้มันง่ายกว่า (และถูกกว่า) ในการเลือกคอลัมน์ก่อนจากนั้นเลือกส่วนของคอลัมน์สำหรับการมอบหมาย

รหัสทดสอบ:

df = pd.DataFrame(np.zeros((20, 3)), columns=['feature_a', 'b', 'c'])
df.feature_a.iloc[[1, 3, 15]] = 88
print(df)

ผล:

    feature_a    b    c
0         0.0  0.0  0.0
1        88.0  0.0  0.0
2         0.0  0.0  0.0
3        88.0  0.0  0.0
4         0.0  0.0  0.0
5         0.0  0.0  0.0
6         0.0  0.0  0.0
7         0.0  0.0  0.0
8         0.0  0.0  0.0
9         0.0  0.0  0.0
10        0.0  0.0  0.0
11        0.0  0.0  0.0
12        0.0  0.0  0.0
13        0.0  0.0  0.0
14        0.0  0.0  0.0
15       88.0  0.0  0.0
16        0.0  0.0  0.0
17        0.0  0.0  0.0
18        0.0  0.0  0.0
19        0.0  0.0  0.0

1
อาจใช้งานได้ แต่ทำไม
Matthew Drury
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.