python dataframe pandas drop column โดยใช้ int


155

ฉันเข้าใจว่าการวางคอลัมน์คุณใช้ df.drop ('ชื่อคอลัมน์', แกน = 1) มีวิธีการวางคอลัมน์โดยใช้ดัชนีตัวเลขแทนชื่อคอลัมน์หรือไม่


ฉันคิดว่าสิ่งนี้จะไม่ทำงานด้วยเหตุผลที่แสดงไว้ที่นี่: stackoverflow.com/questions/13411544/…
จอห์น

คำตอบ:


167

คุณสามารถลบคอลัมน์ในiดัชนีเช่นนี้:

df.drop(df.columns[i], axis=1)

มันอาจทำงานแปลกถ้าคุณมีชื่อซ้ำกันในคอลัมน์ดังนั้นคุณสามารถเปลี่ยนชื่อคอลัมน์ที่คุณต้องการลบคอลัมน์ด้วยชื่อใหม่ หรือคุณสามารถมอบหมาย DataFrame แบบนี้อีกครั้ง:

df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]

4
ฉันคิดว่าคุณพลาดจุด - พวกเขาต้องการที่จะวางตามดัชนีไม่ใช่ตามป้ายกำกับ การแปลงดัชนีเป็นป้ายกำกับเพิ่งจะลดลงตามป้ายกำกับ :(
Darren

วิธีการจัดทำดัชนี cols ถ้าฉันต้องวาง 100 คอลัมน์ที่ต่อเนื่องตรงกลางของกรอบข้อมูล
Sai Kiran

113

วางหลายคอลัมน์ดังนี้:

cols = [1,2,4,5,12]
df.drop(df.columns[cols],axis=1,inplace=True)

inplace=Trueถูกใช้เพื่อทำการเปลี่ยนแปลงใน dataframe ตัวเองโดยไม่ต้องทำคอลัมน์วางลงบนสำเนาของ data frame หากคุณต้องการรักษาสภาพเดิมเอาไว้ใช้:

df_after_dropping = df.drop(df.columns[cols],axis=1)

3
อาร์กิวเมนต์ภายในมีไว้ทำอะไร
sidpat

12
หากคุณไม่ได้ใช้งานinplace=Trueคุณจะต้องทำdf = df.drop()ถ้าคุณต้องการเห็นการเปลี่ยนแปลงในdfตัวเอง
muon

วิธีการจัดทำดัชนี cols ถ้าฉันต้องวาง 100 คอลัมน์ที่ต่อเนื่องตรงกลางเฟรมข้อมูล
Sai Kiran

36

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

# make a df with duplicate columns 'x'
df = pd.DataFrame({'x': range(5) , 'x':range(5), 'y':range(6, 11)}, columns = ['x', 'x', 'y']) 


df
Out[495]: 
   x  x   y
0  0  0   6
1  1  1   7
2  2  2   8
3  3  3   9
4  4  4  10

# attempting to drop the first column according to the solution offered so far     
df.drop(df.columns[0], axis = 1) 
   y
0  6
1  7
2  8
3  9
4  10

อย่างที่คุณเห็นคอลัมน์ Xs ทั้งคู่ถูกดร็อป ทางเลือกอื่น ๆ :

column_numbers = [x for x in range(df.shape[1])]  # list of columns' integer indices

column_numbers .remove(0) #removing column integer index 0
df.iloc[:, column_numbers] #return all columns except the 0th column

   x  y
0  0  6
1  1  7
2  2  8
3  3  9
4  4  10

อย่างที่คุณเห็นสิ่งนี้จะลบเฉพาะคอลัมน์ที่ 0 (แรก 'x')


1
คุณคือฮีโร่ของฉัน. พยายามคิดวิธีที่ฉลาดในการทำสิ่งนี้นานเกินไป
ATK7474

5

คุณต้องระบุคอลัมน์ตามตำแหน่งใน dataframe ตัวอย่างเช่นหากคุณต้องการวาง (คอลัมน์) หมายเลข 2,3 และ 5 มันจะเป็น

df.drop(df.columns[[2,3,5]], axis = 1)

4

หากคุณมีสองคอลัมน์ที่มีชื่อเดียวกัน วิธีง่ายๆวิธีหนึ่งคือเปลี่ยนชื่อคอลัมน์ด้วยตนเองดังนี้: -

df.columns = ['column1', 'column2', 'column3']

จากนั้นคุณสามารถเลื่อนผ่านดัชนีคอลัมน์ตามที่คุณร้องขอเช่นนี้: -

df.drop(df.columns[1], axis=1, inplace=True)

df.column[1] จะลดลงดัชนี 1

จำแกน 1 = คอลัมน์และแกน 0 = แถว


3

หากคุณต้องการที่จะทำมันด้วยจำนวนเต็ม (แต่ทำไม?) จากนั้นคุณสามารถสร้างพจนานุกรม

col_dict = {x: col for x, col in enumerate(df.columns)}

จากนั้นdf = df.drop(col_dict[0], 1)จะทำงานตามที่ต้องการ

แก้ไข: คุณสามารถวางไว้ในฟังก์ชั่นที่ทำเพื่อคุณโดยวิธีนี้มันจะสร้างพจนานุกรมทุกครั้งที่คุณเรียกมัน

def drop_col_n(df, col_n_to_drop):
    col_dict = {x: col for x, col in enumerate(df.columns)}
    return df.drop(col_dict[col_n_to_drop], 1)

df = drop_col_n(df, 2)


-1

เนื่องจากอาจมีหลายคอลัมน์ที่มีชื่อเดียวกันเราควรเปลี่ยนชื่อคอลัมน์ก่อน นี่คือรหัสสำหรับการแก้ปัญหา

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.