วิธีตั้งค่าเซลล์เป็น NaN ในดาต้าเฟรมแพนด้า


104

ฉันต้องการแทนที่ค่าที่ไม่ถูกต้องในคอลัมน์ของดาต้าเฟรมโดย NaN

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

แม้ว่าบรรทัดสุดท้ายจะล้มเหลวและส่งคำเตือนเนื่องจากทำงานกับสำเนา df แล้วอะไรคือวิธีจัดการที่ถูกต้อง? ฉันเคยเห็นวิธีแก้ปัญหามากมายที่มี iloc หรือ ix แต่ที่นี่ฉันต้องใช้เงื่อนไขบูลีน


ฉันรู้สึกว่าชื่อเรื่องทำให้เข้าใจผิด ปัญหาไม่ได้อยู่ที่คุณต้องการ NaN ในดาต้าเฟรมของคุณ ปัญหาคือคุณกำลัง "พยายามตั้งค่าสำเนาชิ้นส่วนจาก DataFrame"
Teepeemm

คำตอบ:


127

เพียงใช้replace:

In [106]:
df.replace('N/A',np.NaN)

Out[106]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

สิ่งที่คุณกำลังพยายามเรียกว่าการจัดทำดัชนีลูกโซ่: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

คุณสามารถใช้locเพื่อให้แน่ใจว่าคุณทำงานบน dF ดั้งเดิม:

In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df

Out[108]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

14

ในขณะที่ใช้replaceดูเหมือนจะแก้ปัญหาฉันต้องการเสนอทางเลือก ปัญหาเกี่ยวกับการผสมของตัวเลขและค่าสตริงบางค่าในคอลัมน์ที่ไม่ให้สตริงถูกแทนที่ด้วย np.nan แต่เพื่อให้ทั้งคอลัมน์เหมาะสม ฉันจะพนันได้เลยว่าคอลัมน์ดั้งเดิมน่าจะเป็นประเภทวัตถุ

Name: y, dtype: object

สิ่งที่คุณต้องการจริงๆคือทำให้เป็นคอลัมน์ตัวเลข (จะมีประเภทที่เหมาะสมและจะเร็วกว่า) โดยแทนที่ค่าที่ไม่ใช่ตัวเลขทั้งหมดด้วย NaN

ดังนั้นรหัสการแปลงที่ดีจะเป็น

pd.to_numeric(df['y'], errors='coerce')

ระบุerrors='coerce'เพื่อบังคับให้สตริงที่ไม่สามารถแยกวิเคราะห์เป็นค่าตัวเลขให้กลายเป็น NaN ประเภทคอลัมน์จะเป็น

Name: y, dtype: float64

10

คุณสามารถใช้แทนที่:

df['y'] = df['y'].replace({'N/A': np.nan})

โปรดทราบinplaceพารามิเตอร์สำหรับreplace. คุณสามารถทำสิ่งต่างๆเช่น:

df.replace({'N/A': np.nan}, inplace=True)

สิ่งนี้จะแทนที่อินสแตนซ์ทั้งหมดใน df โดยไม่ต้องสร้างสำเนา

ในทำนองเดียวกันหากคุณพบค่าที่ไม่รู้จักประเภทอื่นเช่นสตริงว่างหรือค่าไม่มี:

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

ข้อมูลอ้างอิง: Pandas ล่าสุด - แทนที่


3

ในฐานะแพนด้า 1.0.0 คุณไม่จำเป็นต้องใช้ numpy เพื่อสร้างค่า null ในดาต้าเฟรมของคุณอีกต่อไป แต่คุณสามารถใช้ pandas.NA (ซึ่งเป็นประเภท pandas._libs.missing.NAType) แทนได้ดังนั้นจะถือว่าเป็นโมฆะภายในดาต้าเฟรม แต่จะไม่เป็นโมฆะนอกบริบทดาต้าเฟรม


แม้ว่าจะไม่สามารถแก้ปัญหาของ OP ได้ แต่ฉันก็โหวตเพิ่มเพราะตอบคำถามในชื่อเรื่อง
Teepeemm

1
df.loc[df.y == 'N/A',['y']] = np.nan

วิธีนี้ช่วยแก้ปัญหาของคุณ เมื่อใช้ [] สองครั้งคุณกำลังทำงานกับสำเนาของ DataFrame คุณต้องระบุตำแหน่งที่แน่นอนในการโทรครั้งเดียวเพื่อให้สามารถแก้ไขได้


0

คุณสามารถลองใช้ตัวอย่างเหล่านี้

ใน [16]: mydata = {'x': [10, 50, 18, 32, 47, 20], 'y': ['12', '11', 'N / A', '13', ' 15 ',' N / A ']}
ใน [17]: df = pd.DataFrame (mydata)

ใน [18]: df.y [df.y == "N / A"] = np.nan

ออก [19]: df 
    xy
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN

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