วิธีเลือกคอลัมน์ทั้งหมดยกเว้นหนึ่งคอลัมน์ในนุ่น


278

ฉันมีชื่อไฟล์ลักษณะเช่นนี้:

import pandas
import numpy as np
df = DataFrame(np.random.rand(4,4), columns = list('abcd'))
df
      a         b         c         d
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

ฉันจะรับคอลัมน์ทั้งหมดได้column bอย่างไร


@ cs95 - เป้าหมายที่ซ้ำกันที่ระบุไว้ในปัจจุบันไม่ได้ซ้ำกัน แม้จะมีชื่อเดิมคำถามที่เชื่อมโยงคือ "ทำไมไวยากรณ์นี้จึงไม่ทำงาน" ในขณะที่คำถามนี้เป็นคำถามทั่วไปมากกว่า "วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร" - เพิ่มความแตกต่างระหว่างการลบคอลัมน์ออกจาก DataFrame ที่มีอยู่กับการสร้าง DataFrame ใหม่ด้วย all-but-one ของคอลัมน์อื่น
RM

@RM ฉันขอโทษ แต่ฉันไม่เห็นด้วยกับการแก้ไขที่คุณทำกับชื่อในโพสต์นั้นดังนั้นฉันจึงย้อนกลับ มันเป็นความจริงที่เจตนาของ OP คือการตั้งคำถามเกี่ยวกับไวยากรณ์ แต่การโพสต์เริ่มขึ้นเพื่อตอบคำถามที่กว้างขึ้นเกี่ยวกับวิธีลบคอลัมน์ คำตอบในโพสต์นี้เป็นสำเนาของโพสต์ upvote ที่สูงที่สุดที่นั่น ล่ออยู่
cs95

หมายเหตุ: คำถามนี้จะถูกกล่าวถึงในMeta
Monkey Heretic

คำตอบ:


421

เมื่อคอลัมน์ไม่ใช่ MultiIndex df.columnsเป็นเพียงอาร์เรย์ของชื่อคอลัมน์ดังนั้นคุณสามารถทำได้:

df.loc[:, df.columns != 'b']

          a         c         d
0  0.561196  0.013768  0.772827
1  0.882641  0.615396  0.075381
2  0.368824  0.651378  0.397203
3  0.788730  0.568099  0.869127

13
ไม่เลวเลย แต่วิธีแก้ปัญหาของ @ mike dropนั้นดีกว่า IMO สามารถอ่านได้มากขึ้นและจัดการกับ multiindexes ได้
travc

5
ที่จริงผมยอมรับว่า @ วิธีการแก้ปัญหาของ mike ใช้dropจะดีกว่า - ฉันคิดว่ามันมีประโยชน์ที่จะค้นพบว่า (ระดับเดียว) คอลัมน์อาร์เรย์คุณสามารถทำงานกับ แต่เฉพาะสำหรับการวางคอลัมน์dropสามารถอ่านได้มากและทำงานได้ดีกับดัชนีที่ซับซ้อน
Marius

1
ขอบคุณสำหรับคำตอบที่ดี ถ้าฉันไม่มีส่วนหัวล่ะ ฉันจะทำยังไงดี?
FabioSpaghetti

1
เมื่อคุณมีคอลัมน์มากกว่า 1 คอลัมน์ที่จะถูกละเว้น
Bruno Ambrozio

227

ixอย่าใช้ มันเลิก วิธีการทำสิ่งนี้ที่อ่านง่ายที่สุดและมีสำนวนคือdf.drop():

>>> df

          a         b         c         d
0  0.175127  0.191051  0.382122  0.869242
1  0.414376  0.300502  0.554819  0.497524
2  0.142878  0.406830  0.314240  0.093132
3  0.337368  0.851783  0.933441  0.949598

>>> df.drop('b', axis=1)

          a         c         d
0  0.175127  0.382122  0.869242
1  0.414376  0.554819  0.497524
2  0.142878  0.314240  0.093132
3  0.337368  0.933441  0.949598

โปรดทราบว่าโดยค่าเริ่มต้น.drop()จะไม่ทำงานภายใน แม้จะมีชื่อลางร้าย แต่dfก็ไม่เป็นอันตรายโดยกระบวนการนี้ หากคุณต้องการที่จะลบอย่างถาวรbจากการทำdfdf.drop('b', inplace=True)

df.drop()ยังรับรายชื่อของป้ายกำกับเช่นdf.drop(['a', 'b'], axis=1)จะลดลงคอลัมน์และab


1
ทำงานบน multiindex เช่นเดียวกับที่คุณคาดหวัง df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). ดูเหมือนว่าจะใช้ list vs tuple เพื่อตรวจสอบว่าคุณต้องการหลายคอลัมน์ (รายการ) หรืออ้างถึง multiindex (tuple)
travc

16
เพิ่มเติมอ่าน: หรือdf.drop(columns='a') df.drop(columns=['a', 'b'])นอกจากนี้ยังสามารถแทนที่ด้วยcolumns= index=
BallpointBen

อย่างไรก็ตามสิ่งนี้ไม่มีประโยชน์หากคุณไม่ทราบชื่อของคอลัมน์ทั้งหมดที่คุณต้องการจะวาง
yeliabsalohcin

เนื่องจากสิ่งนี้สร้างสำเนาและไม่ใช่มุมมอง / การอ้างอิงคุณไม่สามารถแก้ไขดาต้าเฟรมเดิมได้โดยใช้สิ่งนี้ใน LHS ของการบ้าน
Jan Christoph Terasa

132
df[df.columns.difference(['b'])]

Out: 
          a         c         d
0  0.427809  0.459807  0.333869
1  0.678031  0.668346  0.645951
2  0.996573  0.673730  0.314911
3  0.786942  0.719665  0.330833

9
ฉันชอบวิธีนี้เนื่องจากสามารถใช้เพื่อข้ามคอลัมน์ได้มากกว่าหนึ่งคอลัมน์
Nischal Hp

3
@NischalHp df.drop ยังสามารถข้ามคอลัมน์มากกว่าหนึ่งคอลัมน์ df.drop (['a', 'b'], axis = 1)
Patrick Li

2
ฉันคิดว่ามันคุ้มค่าที่จะทราบว่าวิธีนี้สามารถจัดเรียงคอลัมน์ของคุณอีกครั้ง
ocean800

1
@ ocean800 ใช่มันเป็นเรื่องจริง คุณสามารถผ่านไปได้sort=Falseหากคุณต้องการหลีกเลี่ยงพฤติกรรมนั้น ( df.columns.difference(['b'], sort=False))
ayhan

64

คุณสามารถใช้ได้ df.columns.isin()

df.loc[:, ~df.columns.isin(['b'])]

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

df.loc[:, ~df.columns.isin(['col1', 'col2'])]

12

นี่เป็นอีกวิธีหนึ่ง:

df[[i for i in list(df.columns) if i != '<your column>']]

คุณเพียงส่งคอลัมน์ทั้งหมดเพื่อแสดงยกเว้นคอลัมน์ที่คุณไม่ต้องการ


5

การปรับเปลี่ยนเล็กน้อยอีกอย่างเพื่อ @Salvador Dali ทำให้รายการของคอลัมน์ไม่รวม:

df[[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

หรือ

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

4

ฉันคิดว่าวิธีที่ดีที่สุดที่จะทำคือวิธีที่ @Salvador Dali พูดถึง ไม่ใช่ว่าคนอื่นผิด

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

x_cols = [x for x in data.columns if x != 'name of column to be excluded']

จากนั้นคุณสามารถใส่คอลเลกชันของคอลัมน์เหล่านั้นในตัวแปรx_colsเป็นตัวแปรอื่นเช่นx_cols1การคำนวณอื่น ๆ

ex: x_cols1 = data[x_cols]

คุณช่วยอธิบายได้ไหมว่าทำไมคำตอบนี้จึงเป็นคำตอบที่แยกต่างหากแทนที่จะเป็นความคิดเห็น / ส่วนขยายของคำตอบของซัลวาดอร์?

3

นี่คือแลมบ์ดาบรรทัดเดียว:

df[map(lambda x :x not in ['b'], list(df.columns))]

ก่อน :

import pandas
import numpy as np
df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))
df

       a           b           c           d
0   0.774951    0.079351    0.118437    0.735799
1   0.615547    0.203062    0.437672    0.912781
2   0.804140    0.708514    0.156943    0.104416
3   0.226051    0.641862    0.739839    0.434230

หลัง :

df[map(lambda x :x not in ['b'], list(df.columns))]

        a          c          d
0   0.774951    0.118437    0.735799
1   0.615547    0.437672    0.912781
2   0.804140    0.156943    0.104416
3   0.226051    0.739839    0.434230
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.