จะวางรายการแถวจากดาต้าดาต้าเฟรมได้อย่างไร?


259

ฉันมี dataframe df:

>>> df
                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20060630   6.590       NaN      6.590   5.291
       20060930  10.103       NaN     10.103   7.981
       20061231  15.915       NaN     15.915  12.686
       20070331   3.196       NaN      3.196   2.710
       20070630   7.907       NaN      7.907   6.459

จากนั้นฉันต้องการวางแถวด้วยหมายเลขลำดับที่ระบุไว้ในรายการสมมติว่าที่นี่[1,2,4],เหลืออยู่แล้ว:

                  sales  discount  net_sales    cogs
STK_ID RPT_Date                                     
600141 20060331   2.709       NaN      2.709   2.245
       20061231  15.915       NaN     15.915  12.686
       20070630   7.907       NaN      7.907   6.459

ฟังก์ชั่นหรือสิ่งที่สามารถทำเช่นนั้น?


คำถามนี้เกี่ยวกับการดร็อปแถวด้วยค่าดัชนีเฉพาะ .. การใช้ [1,2,4] คือการชี้ไปยังแถวที่เหลือหลังจากการดร็อป มีคำตอบด้านล่างสำหรับการทำเช่นนี้
การเล่นแร่แปรธาตุ

คำตอบ:


387

ใช้DataFrame.dropและส่งผ่านชุดของป้ายกำกับดัชนี:

In [65]: df
Out[65]: 
       one  two
one      1    4
two      2    3
three    3    2
four     4    1


In [66]: df.drop(df.index[[1,3]])
Out[66]: 
       one  two
one      1    4
three    3    2

18
+1 นอกจากนี้ให้วางแถวสุดท้าย df.drop (df.tail (1) .index)
Nasser Al-Wohaibi

15
คำตอบนี้ใช้ได้เฉพาะถ้า df.index.unique () เหมือนกับ df.index ซึ่งไม่ใช่ข้อกำหนดสำหรับ Pandas DataFrame ไม่มีใครมีวิธีการแก้ปัญหาเมื่อค่า df.index ไม่รับประกันว่าจะไม่ซ้ำกัน?
J Jones

2
สิ่งนี้ไม่อนุญาตให้คุณสร้างดัชนีชื่อดัชนีเอง
ingrid

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

2
ผู้มาใหม่ถึง python: โปรดทราบว่าหากคุณต้องการวางแถวเหล่านี้และบันทึกไว้ใน dataframe เดียวกัน (inplace) คุณต้องเพิ่มaxis=0(0 = แถว, 1 = คอลัมน์) และinplace=Trueตามdf.drop(df.index[[1,3]], axis=0, inplace=True)ด้วย @mezzanaccio หากคุณรู้ว่าดัชนีใดที่คุณต้องการแทนที่ (และใช้ตัวอย่าง 0 ถึง n ของคุณด้วย):df.drop(df.index[range(0, n)], axis=0, inplace=True)
mrbTT

112

โปรดทราบว่าอาจเป็นสิ่งสำคัญที่จะใช้คำสั่ง "inplace" เมื่อคุณต้องการทำแบบหล่นในบรรทัด

df.drop(df.index[[1,3]], inplace=True)

เนื่องจากคำถามดั้งเดิมของคุณไม่ส่งคืนสิ่งใดจึงควรใช้คำสั่งนี้ http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html


47

หาก DataFrame มีขนาดใหญ่และจำนวนแถวที่จะปล่อยมีขนาดใหญ่เช่นกันการดรอปแบบดัชนีโดยdf.drop(df.index[])ใช้เวลามากเกินไป

ในกรณีของฉันฉันมี DataFrame หลายดัชนีที่มีการลอยด้วย100M rows x 3 colsและฉันต้องลบ10kแถวออกจากมัน วิธีที่เร็วที่สุดที่ฉันพบคือค่อนข้างตรงกันข้ามกับtakeแถวที่เหลือ

อนุญาตindexes_to_dropเป็นอาร์เรย์ของดัชนีตำแหน่งเพื่อวาง ( [1, 2, 4]ในคำถาม)

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))

ในกรณีของฉันนี้ใช้20.5sในขณะที่ง่ายdf.dropเอา5min 27sและใช้หน่วยความจำมาก DataFrame ที่ได้นั้นเหมือนกัน


43

นอกจากนี้คุณยังสามารถส่งผ่านไปDataFrame.drop ป้ายชื่อตัวเอง (แทนชุดของป้ายดัชนี):

In[17]: df
Out[17]: 
            a         b         c         d         e
one  0.456558 -2.536432  0.216279 -1.305855 -0.121635
two -1.015127 -0.445133  1.867681  2.179392  0.518801

In[18]: df.drop('one')
Out[18]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

ซึ่งเทียบเท่ากับ:

In[19]: df.drop(df.index[[0]])
Out[19]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

1
df.drop (df.index [0]) สามารถใช้งานได้เช่นกัน ฉันหมายถึงไม่จำเป็นต้องมีสอง square_brackets (กับแพนด้า 0.18.1 อย่างน้อย)
tagoma

23

ฉันแก้ไขมันด้วยวิธีที่ง่ายกว่า - เพียงแค่ 2 ขั้นตอน

ขั้นตอนที่ 1: ขั้นแรกให้สร้างไฟล์ข้อมูลด้วยแถว / ข้อมูลที่ไม่ต้องการ

ขั้นตอนที่ 2: ใช้ดัชนีของ dataframe ที่ไม่ต้องการนี้เพื่อวางแถวจาก dataframe ดั้งเดิม

ตัวอย่าง:

สมมติว่าคุณมี dataframe df ซึ่งมีคอลัมน์จำนวนมากรวมถึง 'Age' ซึ่งเป็นจำนวนเต็ม ตอนนี้สมมติว่าคุณต้องการวางแถวทั้งหมดด้วย 'อายุ' เป็นจำนวนลบ

ขั้นตอนที่ 1: df_age_negative = df [df ['Age'] <0]

ขั้นตอนที่ 2: df = df.drop (df_age_negative.index, axis = 0)

หวังว่านี่จะง่ายกว่าและช่วยคุณได้มาก


1
+1 นี่เป็นคำตอบเดียวที่บอกวิธีลบแถวโดยเลือกคอลัมน์ที่แตกต่างจากแถวแรก
Alejo Bernardin

10

ถ้าฉันต้องการวางแถวที่มีสมมุติว่าดัชนีxฉันจะทำต่อไปนี้:

df = df[df.index != x]

หากฉันต้องการวางดัชนีหลายอัน (บอกว่าดัชนีเหล่านี้อยู่ในรายการunwanted_indices) ฉันจะทำ:

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]

6

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

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

และตอนนี้เพื่อวางแถวเหล่านั้นโดยใช้ดัชนีของพวกเขา

new_df = df.drop(ind_drop)

3

ในความคิดเห็นต่อคำตอบของ @ theodros-zelleke @ j-jones ถามเกี่ยวกับสิ่งที่ต้องทำหากดัชนีไม่ซ้ำกัน ฉันต้องจัดการกับสถานการณ์เช่นนี้ สิ่งที่ฉันทำคือการเปลี่ยนชื่อรายการซ้ำในดัชนีก่อนที่ฉันจะเรียกdrop()a:

dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)

ซึ่งrename_duplicates()เป็นฟังก์ชั่นที่ผมกำหนดไว้ที่เดินผ่านองค์ประกอบของดัชนีและเปลี่ยนชื่อที่ซ้ำกัน ฉันใช้รูปแบบการเปลี่ยนชื่อเดียวกันกับที่pd.read_csv()ใช้กับคอลัมน์เช่น"%s.%d" % (name, count)ที่ซึ่งnameชื่อของแถวcountนั้นและเกิดขึ้นกี่ครั้งก่อนหน้านี้


1

การกำหนดดัชนีจากบูลีนตามที่อธิบายไว้ข้างต้นเช่น

df[df['column'].isin(values)].index

สามารถใช้หน่วยความจำได้มากกว่าการกำหนดดัชนีโดยใช้วิธีนี้

pd.Index(np.where(df['column'].isin(values))[0])

นำไปใช้เช่นนั้น

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

วิธีนี้มีประโยชน์เมื่อจัดการกับ dataframes ขนาดใหญ่และหน่วยความจำที่ จำกัด


0

ใช้เฉพาะดัชนีหาเรื่องเพื่อวางแถว: -

df.drop(index = 2, inplace = True)

สำหรับหลายแถว: -

df.drop(index=[1,3], inplace = True)

0

พิจารณาตัวอย่างดาต้าเฟรม

df =     
index    column1
0           00
1           10
2           20
3           30

เราต้องการวางแถวที่ 2 และ 3

วิธีที่ 1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

วิธีที่ 2

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.