Pandas DataFrame: แทนที่ค่าทั้งหมดในคอลัมน์ตามเงื่อนไข


132

ฉันมี DataFrame ง่ายๆดังต่อไปนี้:

แพนด้าดาต้าเฟรม

ฉันต้องการเลือกค่าทั้งหมดจากคอลัมน์ 'ซีซั่นแรก' และแทนที่ค่าที่มากกว่า 1990 ด้วย 1 ในตัวอย่างนี้มีเพียงบัลติมอร์เรเวนเท่านั้นที่จะแทนที่ปี 1996 ด้วย 1 (ทำให้ข้อมูลที่เหลือยังคงอยู่)

ฉันได้ใช้สิ่งต่อไปนี้:

df.loc[(df['First Season'] > 1990)] = 1

แต่จะแทนที่ค่าทั้งหมดในแถวนั้นด้วย 1 ไม่ใช่แค่ค่าในคอลัมน์ "ซีซันแรก"

ฉันจะแทนที่เฉพาะค่าจากคอลัมน์นั้นได้อย่างไร

คำตอบ:


226

คุณต้องเลือกคอลัมน์นั้น:

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

ดังนั้นไวยากรณ์ที่นี่คือ:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

คุณสามารถตรวจสอบเอกสารและ10 นาทีในการแพนด้าซึ่งแสดงความหมาย

แก้ไข

หากคุณต้องการสร้างตัวบ่งชี้บูลีนคุณสามารถใช้เงื่อนไขบูลีนเพื่อสร้างซีรี่ส์บูลีนและส่ง dtype ไปที่intสิ่งนี้จะแปลงTrueและFalseเป็น1และ0ตามลำดับ:

In [43]:
df['First Season'] = (df['First Season'] > 1990).astype(int)
df

Out[43]:
                 Team  First Season  Total Games
0      Dallas Cowboys             0          894
1       Chicago Bears             0         1357
2   Green Bay Packers             0         1339
3      Miami Dolphins             0          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers             0         1003

40

ไปปาร์ตี้ช้าไปหน่อย แต่ฉันชอบใช้ numpy โดยที่:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])

2
ฉันกำลังมองหาวิธีแก้ปัญหาสำหรับการเขียนทับค่าคอลัมน์ตามเงื่อนไข แต่ขึ้นอยู่กับค่าของคอลัมน์อื่นเช่น: df ['col1'] = np.where (df ['id'] == '318431682259014', 'NEW', df ['col1']) นี่คือคำตอบสำหรับมัน
user582175

ฉันพยายามที่จะทำเช่นนี้สำหรับหลายเงื่อนไขเช่นนี้ ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()แต่ฉันให้ได้รับ df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]สิ่งที่ฉันพยายามที่จะทำนั้น ใครมีความคิดเกี่ยวกับเรื่องนี้บ้าง?
M.Schalk

6
df['First Season'].loc[(df['First Season'] > 1990)] = 1

แปลกที่ไม่มีคำตอบนี้ส่วนที่ขาดหายไปเพียงอย่างเดียวในโค้ดของคุณคือ ['ซีซั่นแรก'] ต่อจาก df และเพียงแค่ถอดวงเล็บปีกกาออก


ที่ให้ 'SettingWithCopyWarning:' จะดีกว่าถ้าใช้. loc สำหรับสิ่งทั้งหมดเช่นในคำตอบของ EdChum
ambitiousdonut

2

สำหรับเงื่อนไขเดียวคือ ( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

ใช้สิ่งนี้:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

ดังนั้นไวยากรณ์ที่นี่คือ:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

สำหรับหลายเงื่อนไขเช่น (df['employrate'] <=55) & (df['employrate'] > 50)

ใช้สิ่งนี้:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

ดังนั้นไวยากรณ์ที่นี่คือ:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])

0
df.loc[df['First season'] > 1990, 'First Season'] = 1

คำอธิบาย:

df.locรับสองอาร์กิวเมนต์ 'row index' และ 'column index' เรากำลังตรวจสอบว่าค่านั้นมากกว่า 27 ของค่าแต่ละแถวหรือไม่ภายใต้คอลัมน์ "ซีซันแรก" จากนั้นเราแทนที่ด้วย 1

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